理解/mySQL 又名欺骗 Django 中的 ForeignKey 关系
本教程将介绍理解/mySQL 又名欺骗 Django 中的 ForeignKey 关系的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
所以我继承了一些 django.
mySQL 表很简单,其中 parent 不是 FK 关系,只是Parent"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 仍然可以很好地处理关系.
Not having an actual constraint might lead to broken references, invalid parents and other sorts of data inconsistencies. I am not a Django expert but I would venture a guess that in most cases Django will still handle the relations fine unless you purposefully add some invalid records.
通常,如果您的 RDBMS 支持外键约束,则绝对没有理由不使用它们,忽略它们可能会被视为设计缺陷.
您应该考虑添加键约束.它们不仅可以让您的 DBMS 很好地了解怎么优化查询,还可以确保数据的一致性.我很确定 Django 在某处有一个设置,它会在您运行 manage.py syncdb
关于为什么你应该更喜欢外键的更多信息,你应该阅读 MySQL 外键文档
最有趣的是:
InnoDB 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描.在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列.如果引用表不存在,则会在引用表上自动创建此类索引.(这与一些旧版本形成对比,在这些旧版本中,索引必须显式创建,否则外键约束的创建将失败.) index_name,如果给定,则如前所述使用.
好了关于理解/mySQL 又名欺骗 Django 中的 ForeignKey 关系的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。