Python 在SQL中我应该如何避免代理主键?

Python 在SQL中我应该如何避免代理主键?,python,sqlalchemy,primary-key,Python,Sqlalchemy,Primary Key,短篇小说 我手头的第三方库有一个技术问题,除了创建代理密钥之外,我似乎无法轻松解决这个问题(尽管我永远都不需要它)。我已经在网上读了很多不鼓励使用代理密钥的文章,我有点不知所措,是否可以按照我的意愿去做 说来话长 我需要指定一个主键,因为我使用SQLAlchemy ORM(它需要一个),我不能在\uuu mapper\u args\uuuu中设置它,因为类是用classobj构建的,我还没有找到在适当的PK定义参数中引用尚未存在的类的字段的方法。另一个问题是PK的自然等价物是一个复合键,它对于我

短篇小说
我手头的第三方库有一个技术问题,除了创建代理密钥之外,我似乎无法轻松解决这个问题(尽管我永远都不需要它)。我已经在网上读了很多不鼓励使用代理密钥的文章,我有点不知所措,是否可以按照我的意愿去做

说来话长

我需要指定一个主键,因为我使用SQLAlchemy ORM(它需要一个),我不能在
\uuu mapper\u args\uuuu
中设置它,因为类是用classobj构建的,我还没有找到在适当的PK定义参数中引用尚未存在的类的字段的方法。另一个问题是PK的自然等价物是一个复合键,它对于我使用的MySQL版本来说太长了(而且通常使用这么长的主键是个坏主意)。

在使用ORM时,我总是制作代理键(或者更确切地说,我让ORM为我制作它们)。他们解决了许多问题,并且没有引入任何(重大)问题

所以,你已经完成了你的工作,承认有“网上文件”有正当的理由来避免代理密钥,并且可能有更好的方法来做到这一点


现在,在源代码中的某个地方编写“
#TODO:找到一种避免代理键的方法”
,然后去完成一些工作

“使用代理密钥允许在使用自然密钥可以避免此类问题时创建重复项”,因此您应该同时拥有两个密钥,而不仅仅是代理密钥。您似乎犯的错误并不是您正在使用代理,而是您假设表只需要一个键。确保您创建了确保数据完整性所需的所有密钥


话虽如此,在这种情况下,似乎ORM软件的缺陷(显然不能使用复合密钥)才是问题的真正原因。不幸的是,这样的软件限制会迫使您创建不需要的密钥。也许你可以考虑使用不同的软件。

< P>我使用一个DB中的代理键,我使用SqLalCyy进行反射。其优点是,您可以更轻松地管理表/模型中存在的外键/关系。此外,rdbms更有效地管理数据。缺点是数据不一致:重复。要避免这种情况,请始终在自然关键点上使用唯一约束


现在,我从您的长篇大论中了解到,由于mysql的限制,您无法强制实现这种唯一性。对于长组合键,mysql会导致问题。我建议您转到postgresql。

事实上,据我所知,使用代理键(例如序列)是最佳做法。恐怕不是。当使用自然密钥可以防止此类问题时,使用代理密钥允许创建重复项。如果我想的方向不对,请解释一下你的观点。当涉及到你的逻辑模型时,你的主键应该几乎总是一个自然键。当涉及到物理模型时,即在数据库级别实际使用的内容,主键应始终是对自然键具有唯一约束的代理键。只有在忘记在自然键上包含唯一索引的情况下,“使用代理键允许创建重复项”。一个常见错误。如果你不打算添加TODO,请不要添加TODO。如果你现在认为这是一种浪费精力的行为,那么将来这将是一种浪费精力的行为,你所做的一切就是在每次你发布“TODO | XXX | FIXME”时都要浪费的垃圾清单上加上TODO。加上TODO可以免除你的良心,因为你有一些基于“网络上的许多文章”的指导你认为这很重要,但在这种情况下显然是不合适的。当我在寻找“正确”的方法做某事时,我会经常这样做,然后在重构周期中回来确定“正确”的方法是否确实是必要的。我使用TODO:仅仅是因为“TODO:”在几乎所有IDE中都是一种方便的方式,可以增加源代码行的可见性。如果你对学术严谨性的评价更适合你,那就去做吧!:)这不是一个非常实用的原则,因为支持复合主键的orm太少了,所以您只能使用一小部分软件。下次您遇到软件限制并应用此原则时,集合的交集将使您完全没有选择。“ORM软件的缺陷(显然无法使用复合键)”几乎没有。这是ORM使用中的一个缺陷,因为它无法在复合自然键上声明唯一索引。许多ORM支持代理键之外的“唯一”声明。