所以我继承了一些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;
我想知道的是以下内容:
- 这种“诡计”会带来什么问题呢?
- 虽然这似乎有效 - 是否推荐或建议。
- 我们是否建议将 SQL 修改为添加约束?
非常感谢!
没有实际的约束可能会导致引用损坏、父级无效以及其他类型的数据不一致。我不是 Django 专家,但我大胆猜测,在大多数情况下 Django 仍然可以很好地处理关系,除非您故意添加一些无效记录。
通常,如果您的 RDBMS 支持外键约束,那么绝对没有理由不使用它们,并且忽略它们可能会被视为设计缺陷。
您应该考虑添加关键约束。它们不仅让您的 DBMS 了解如何优化查询,还确保数据的一致性。我很确定 Django 在某处有一个设置,可以在运行时自动生成 SQL 以添加关键约束manage.py syncdb
有关为什么您应该更喜欢外键的更多信息,您应该阅读MySQL 外键文档
最有趣的是:
InnoDB 需要外键和引用键上的索引,以便外键检查可以快速并且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建此类索引。 (这与某些旧版本形成对比,在旧版本中必须显式创建索引,否则外键约束的创建将失败。)index_name(如果给定)将按前面所述使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)