客户坚持让可编辑列成为表的主键

Posted

技术标签:

【中文标题】客户坚持让可编辑列成为表的主键【英文标题】:Client insists on making an editable column the primary key of a table 【发布时间】:2011-11-12 10:44:30 【问题描述】:

我正在 Django 上构建一个网络应用程序。客户坚持认为某个表上的某些列应该是主键,他不想要自动增量。但他也希望该列在应用程序中是可修改的,指出 Postgres 可以处理它(ON UPDATE CASCADE 子句)。我怎样才能让他摆脱困境,或者我应该同意这一点?他很固执。

编辑: 我至少想知道按照他说的做事是否有害,或者这种方法有什么陷阱。

【问题讨论】:

他的理由是什么? 如果他想做开发,为什么要雇用你?如果他认为他正在引领发展,那就让他来吧。如果他雇用你是因为你更了解,那么坚决告诉他不,做正确的事 这实际上是一个学术项目(波兰科学院),他知道一些事情(我有时会忘记他主修计算机科学......)但他对数据库的想法很奇怪。他希望在手动编写 SQL 查询和查看 SQL shell 中的结果的上下文中优化 db,他希望执行“select * from foo natural join bar”并查看有意义的列而不是自动生成的键。实际上,我之前已经从他的脑海中剔除了一些疯狂的 db 想法。 他想要的东西一点也不猥亵。如果数据中已经存在完全可用的自然键,则不需要代理键。数据库设计在 ORM 之前就已经存在。 我只是认为可变列不是一个完全可行的自然键,因为级联。 【参考方案1】:

可以做到,来自Django's docs regarding auto pk:

如果您想指定自定义主键,只需指定 primary_key=True 在您的一个字段上。如果 Django 看到你 显式设置 Field.primary_key,它不会添加自动 id 列。

但是,pk 通常用于对象标识和检索。手动管理它们并确保唯一性是一个 PITA,它不仅仅是编辑它们,还需要在创建对象并将其存储在数据库中时呈现和唯一性。

【讨论】:

以上是关于客户坚持让可编辑列成为表的主键的主要内容,如果未能解决你的问题,请参考以下文章

APEX 主键列被编辑替换

在SQL SERVER 中对表不能设置主键

如何确定列是不是在其表的主键中? (SQL 服务器)

JPA映射:一个表的主键列到另一个表的非Pk/Fk列

如何在各种 .NET ORM 中使列成为自动递增的主键?

Mysql:如何使物化视图中的列成为主键