Django 或类似的复合主键

Posted

技术标签:

【中文标题】Django 或类似的复合主键【英文标题】:Django or similar for composite primary keys 【发布时间】:2010-12-10 02:28:39 【问题描述】:

我正在为我的工程公司编写一个 Web 应用程序(警告:我只是一个业余爱好的程序员)并计划使用 Django,直到遇到这个问题。我要使用的模型自然具有多列主键。根据http://code.djangoproject.com/ticket/373,我不能使用 Django,至少不能使用已发布的版本。任何人都可以帮助我解决问题,无论是通过另一个 Web 框架(请仅基于 Python)还是建议对模型进行更改以使其适用于 Django 的限制?我真的很希望后者,因为我希望以此为契机来学习 Django。

示例: 表一有 part_number 和 part_revision 作为两个字段,应该包含一个主键。一个 P/N 可以存在于多个修订版中,但 P/N + rev 是唯一的。

表二的主键为part_number、part_revision 和dimension_number。特定转速的 P/N 可以有多个维度,但是,每个维度都是唯一的。另外,在这种情况下,P/N + rev 应该是表一的 ForeignKey。

【问题讨论】:

【参考方案1】:

SQLAlchemy 支持复合主键和外键,因此任何基于 SQLAlchemy 的框架(想到 Pylons 和 Werkzeug)都应该满足您的需求。但是代理主键更容易使用,而且得到更好的支持。

【讨论】:

【参考方案2】:

我强烈建议使用代理键。不是因为它是“Djangoesque”。假设您使用包含 part_number 的复合键。如果一段时间后您的公司决定更改该字段的格式(以及值)怎么办?或者一般来说,任何领域?您不想处理更改主键。我不知道您在使用由“真实”值组成的复合键时会看到什么好处,但我认为这不值得麻烦。使用无意义的自动递增键(这可能会使复合键无用)。

【讨论】:

这应该被修改了很多。关于为什么代理是一个更好的主意的一篇好文章是:agiledata.org/essays/keys.html 软件行业最大的问题是每个人都在尝试更大规模地解决给定的问题。另一方面,如果我试图将 Django 应用于其结构可能会或可能不会更改的预定义数据集怎么办?更重要的是,这是 Django 本身的用例之一:“有期限的完美主义者的框架”。【参考方案3】:

为什么不添加一个普通的主键,然后将part_numberpart_revision指定为unique_together

这本质上就是米奇小麦所说的 Djangoish(Djangonic?)方式。

【讨论】:

哇!这实际上是最好的解决方案! Djangonic 与 Pythonic 保持一致 :)【参考方案4】:

一种解决方法是创建一个代理键(一个自动递增列)作为主键列,并在您的域复合键上放置一个唯一索引。

然后外键将引用代理主键列。

【讨论】:

以上是关于Django 或类似的复合主键的主要内容,如果未能解决你的问题,请参考以下文章

为啥复合主键还在?

使用 Cloudformation 创建具有复合主键的 DynamoDB

无法确定类型的复合主键排序

如何识别任何 Mysql 数据库表中的复合主键?

mysql的联合主键与复合主键区别

Android房间复合主键,排序顺序