【问题标题】:Can I avoid redundant primary key columns in a MySQL table for django (python)?我可以避免 django(python)的 MySQL 表中的冗余主键列吗?
【发布时间】:2011-10-19 05:12:15
【问题描述】:

我知道,如果我使用 Django 的 ORM,每个表都必须有一个主键列。不知何故,如果你有一个链接到表的 many_to_many 表(我们称它们为作者和书籍),你会得到类似的东西:

id     author_id     book_id
1      1             1
2      1             2
3      2             3
etc.

我遇到了一本书,其中建议避免使用“id”列并改为创建复合主键。这适用于 django 吗?

【问题讨论】:

  • 我对支持/反对的论点感兴趣。文章在哪里?
  • 对于链接表,不需要直接访问。只需使用 Django 的 ManyToManyField 并使用 'through' 参数指定链接表。见:docs.djangoproject.com/en/dev/topics/db/models/…
  • @Sonny:我写了article,意思是book。它的标题是 Bill Karwin 编写的 SQL 反模式:避免数据库编程的陷阱。他指出,如果您必须对(在上面的示例中)author_idbook_id 施加复合唯一约束。如果这样做,复合键将具有与id 列相同的属性。所以它变得多余。这篇文章很长,里面有更多的论据,但我认为这是它的精髓,如果我没记错的话,就是这样。 :-)
  • 这很好,但他的建议不适用于 django,因为 django 不支持复合主键。事实上,我认为复合 pk 通常是一个坏主意,因为它将您的密钥与您的数据联系起来,使您的 pk 更宽,并且具有各种其他小的负面因素......所有这些都是为了避免冗余的唯一性。如果我以后真的有动力,我可能会查找一些关于从不使用复合 pk 的原因的文章

标签: mysql django primary-key compound-key


【解决方案1】:

您可以在直通表上创建一个复合主键(使用 ALTER TABLE)。您还可以从表中删除 id 列。这些都不会损害 django,因为 ManyToMany 字段在后端工作的方式无论如何都不会使用 id 列。

但是你应该注意,让复合 PK 在 django 中工作基本上是一个非首发。这对您来说应该不是问题,因为任何表都不应该有一个 ForeignKey 到您的直通表(至少出于我能想到的任何原因。

总之。复合主键不适用于 django。因此,如果您需要对具有复合 PK 的表使用 ForeignKey,那么您基本上就是 SOL。最后,这里没有关于使用复合 PK 的真正专业人士,但也没有真正的骗局(在这种情况下也是唯一的情况)。那你为什么要花时间担心这个呢?

【讨论】:

  • 我只是想了解作者的想法并扩展我对可行的知识。这里没有任何成果。顺便问一下,SOL 是什么意思?
  • 作者的论点可能是,通过创建冗余唯一约束,您最终会为该表编写两个索引而不是一个;添加少量的写入开销。最重要的是,id 上的索引可能永远不会被使用。在这种情况下,您很可能可以安全地使用 django 创建复合 pk,但您不能将此体验扩展到基本上任何其他关系
猜你喜欢
  • 2017-08-10
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多