首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是使用单个主键还是组合主键?

是使用单个主键还是组合主键?
EN

Stack Overflow用户
提问于 2013-05-31 22:19:45
回答 1查看 242关注 0票数 1

我是第一次设计一个基于项目的数据库,需要一些关于如何最好地确定是使用单个主键还是组合主键的建议?

我们有许多现有的独立的基于项目的数据库,但从未将它们组合成一个数据库,即使它们遵循相同的结构。

所有表格都基于2个主要字段

1)项目代码

2)项目编号

这些总是放在一起,并且出现在所有的表中。项目代码和项目代码对每个用户都非常有意义,因为它们将描述由项目代码和项目编号(实际写在它们上面)标识的物理对象。

项目代码始终是唯一的,而条目编号的范围从1到n(其中n是任意数字,但从不重复)。开始一个新项目,new表条目号再次从1开始。

因此,数据库的基础如下。

表:项目列表

字段:项目编码(主键),其他字段...

表:项目列表

字段:项目编码(FK)、物料编号(PK?)、其他字段...

表:任何其他表

字段:项目代码(FK)、条目编号(FK?)、其他字段...

对我来说,将项目代码作为主键是有意义的,但是项目代码不能是主键,因为它不是唯一的。项目编号1-n将在每个项目中重复,但这是每个人的主要参考。

我的第一个想法是创建一个名为Item_ID的代理主键,它在item list表中自动递增,然后在所有其他表中将其用作外键,

所以..。它看起来就像

表:项目列表

字段:项目编码(主键),其他字段...

表:项目列表

字段:项目编码(FK)、Item_ID (主键)、条目号、其他字段...

表:任何其他表

字段:项目代码(FK)、Item_ID (FK)、Item表条目号、其他字段...

但是,item_ID键对每个使用它的人都没有意义,他们必须不断询问我的物品编号是什么,才能将它链接到它的父表。

我的第二个想法是通过将项目代码添加到公式项目CODE_ITEM编号中的项目编号来使项目编号唯一。例如,如果项目代码是"Project1“,那么项目编号可以写为"Project1_24”。这将使条目编号是唯一的,因此可以用作主键。

(假设子表有自己的主键)。

所以它们看起来是这样的:

表:项目列表

字段:项目编码(主键),其他字段...

表:项目列表

字段:项目编码(FK)、物料编号(PK)、其他字段...

表:任何其他表

字段:项目代码(FK)、条目编号(FK)、其他字段...

这是可行的,因为它仍然保留了对每个用户都有意义的项目编号。但这似乎有点长篇大论,因为他们每次都必须输入项目CODE_ITEM编号才能做出正确的引用。他们习惯于只写项目编号。

..maybe有一些方法可以自动化这个过程,这样他们仍然可以写数字,但是数据库在它后面添加了项目代码..我不知道?

我的第三个想法是使项目代码和项目编号成为项目列表中的组合键,并为项目列表中的项目代码创建一个代理键。

所以看起来是这样的:

表:项目列表

字段: Project_ID (主键),其他字段...

表:项目列表

字段: Project_ID (FK),项目代码(CPK),项目编号,(CPK),其他字段...

表:任何其他表

字段: Project_ID (FK),项目代码(CFK),条目编号,(CFK),其他字段...

这是可以的,因为输入项目ID将相当直接,并且项目代码和项目编号在组合使用时会成为一个自然的关键字。在任何记录中,它们都会一起出现,并且是唯一的。

但是我应该使用哪种方法呢?

EN

回答 1

Stack Overflow用户

发布于 2013-05-31 23:25:44

对于您的条目列表表,我认为您可能需要一个复合主键,因为您将在此数据库中列出多个项目,并且由于条目代码不是唯一的,因此您需要将其与项目代码组合以唯一标识它。

如果您没有组合键,并且您试图仅映射到不唯一的时间代码,那么当您查询数据库时,您将得到所谓的笛卡尔乘积--无用的行、行和行。

数据建模非常有趣,一个建模良好的数据库非常值得花时间去做正确的事情。网上有一些书,可能还有一些教程,可以帮助你做到这一点,而且阅读起来不会花太多时间。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16859541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档