理解/mySQL 又名欺骗 Django 中的外键关系

2023-12-02

所以我继承了一些django。

mySQL 表非常简单,其中父级不是 FK 关系,只是“父级”id:

CREATE TABLE `Child` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent` int(10) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24;

但后来创始人却这么做了..

class Child(models.Model):
    """Project Child information"""
    id = models.AutoField(primary_key=True)
    parent = models.ForeignKey(Parent)
    name = models.CharField(max_length=255)

    class Meta:
        managed = False

诚然,我不是 SQL 骑师,但我知道“真正的”外键关系看起来与此通知类似CONSTRAINT...

CREATE TABLE `Child` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `child_63f17a16` (`parent_id`),
  CONSTRAINT `parent_id_refs_id_34923e1e` FOREIGN KEY (`parent_id`) REFERENCES `Parent` (`id`)
) ENGINE=InnoDB;

我想知道的是以下内容:

  1. 这种“诡计”会带来什么问题呢?
  2. 虽然这似乎有效 - 是否推荐或建议。
  3. 我们是否建议将 SQL 修改为添加约束?

非常感谢!


  1. 没有实际的约束可能会导致引用损坏、父级无效以及其他类型的数据不一致。我不是 Django 专家,但我大胆猜测,在大多数情况下 Django 仍然可以很好地处理关系,除非您故意添加一些无效记录。

  2. 通常,如果您的 RDBMS 支持外键约束,那么绝对没有理由不使用它们,并且忽略它们可能会被视为设计缺陷。

  3. 您应该考虑添加关键约束。它们不仅让您的 DBMS 了解如何优化查询,还确保数据的一致性。我很确定 Django 在某处有一个设置,可以在运行时自动生成 SQL 以添加关键约束manage.py syncdb

有关为什么您应该更喜欢外键的更多信息,您应该阅读MySQL 外键文档

最有趣的是:

InnoDB 需要外键和引用键上的索引,以便外键检查可以快速并且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建此类索引。 (这与某些旧版本形成对比,在旧版本中必须显式创建索引,否则外键约束的创建将失败。)index_name(如果给定)将按前面所述使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解/mySQL 又名欺骗 Django 中的外键关系 的相关文章

  • 浏览器关闭后从数据库中删除

    我正在开发一个电子商务应用程序 但问题是 当用户将产品添加到购物车并在订购前关闭浏览器时 购物车会带走所有产品 所有购物车项目都保存在表中 如果用户关闭浏览器而不订购 我只想刷新购物车 您可以使用 Javascript 事件捕获浏览器关闭并
  • 重新排列mysql中的主键

    从MySQL表中删除一些行后如何重新排列主键列值 例如 一个包含 4 行数据的表 主键值为 1 2 3 4 当删除第2行和第3行时 第4行的键值变为2 请帮助我找到解决方案 为什么要这样做 你不需要重新排列您的密钥 因为它只是记录的数字和标
  • Django 类视图未返回 HttpResponse 对象。它返回 None 相反

    urls py from housepost views import ListingPost url r house post ListingPost as view name post house views py from djang
  • MySQL 多个 IN 条件对同一个表进行子查询

    我有多个带有子查询的 IN 条件 SELECT S name S email FROM something S WHERE 1 NOT IN SELECT id FROM tags WHERE somethingId S id AND 2
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • mysql变量赋值:如何强制赋值顺序?

    由于mysql是一种声明性语言 我找不到强制赋值变量顺序的方法 采取这个查询 SET v1 0 SET v2 0 SELECT v1 v2 FROM MyTable table WHERE v1 v2 is not null AND v2
  • 使用 JOIN 和 UNION 合并不同表中的记录

    我需要创建一个查询来组合两个表中的数据 我认为可能是 JOIN 和 UNION 的组合 在此示例中 我需要列出状态处于活动状态的所有姓名 仅一次 并将他们的葡萄酒 苏打水 晚餐 甜点和水果偏好组合起来 按姓名排序 我不确定单独的 JOIN
  • Django 如何使表单字段可选

    在 django 中如何使表单字段可选 我的模型 class Student models Model first name models CharField max length 30 last name models CharField
  • 无法为 Django 的重置密码流程创建集成测试

    我正在尝试对密码重置流程实施集成测试 但我陷入了 密码重置 确认 视图 我已经手动测试了该流程 并且工作正常 不幸的是 Django 单元测试客户端似乎无法正确遵循此视图中所需的重定向 网址配置 from django contrib au
  • 从 .frm 文件恢复 mysql 数据库

    我每周都会倾倒所有桌子以获得备份 但后来我明白它只是存储表的 frm文件 它不显示表的 MYD 和 MYI 文件 所以我只有我的数据库的 frm 文件 而且我的数据库是innodb 那么我可以用数据库中的数据获取我的数据库吗 是的 这是可能
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • 通用 Oracle 数据收集存储

    我正在设计一个新的实验室数据库 我想将所有测试的原始结果存储在一起 在某些情况下 结果是单个值 然而 结果有时是原始波形或信号 下面哪种情况是理想的 以及为什么 或提供您自己的理想选择 选项 1 将每个单独的数据点存储为单独的结果行 距 t
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • Django ORM:使用具有“and”功能的对象列表进行过滤

    新手问题 Models Item model Models attributes models ManyToManyField Attributes null True Attributes models Models title mode
  • 如何在序列化器中设置默认值?

    我有这些序列化器 gt id serializers IntegerField gt name serializers CharField gt age serializers IntegerField 现在 我向序列化器提供以下数据 id
  • 如何使用ckeditore通过ajax发送数据?

    我在 django 中有一个表格 这是 撰写邮件 形式 我将此表单从视图发送到我的模板 然后应用 ckeditor 来更改正文样式 我希望通过 ajax 发布此表单 当使用 ckeditor 时 body 字段的值不会随 request P
  • 如何将另一列的整数值添加到日期列?

    我试图将整数添加到日期 但出现以下错误 1064 你的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在第 6 行的 wp OrderDate INTERVAL WPProduct Duration DAY AS
  • Django DetailView 按外键过滤

    我有点困惑 想利用 DetailView 功能 使用外键作为我的过滤器来显示数据 基本上我的模型看起来像这样 class Category models Model name models CharField max length 30 s
  • 使用 django 和 tastypie 通过 RESTful api 发布文件

    我正在为 Django 网站创建 RESTful api 我在用tastypie https github com toastdriven django tastypie因为这样做 我的问题是我无法设计如何通过此 api 发布图像或文件 我

随机推荐