我是第一次设计一个基于项目的数据库,需要一些关于如何最好地确定是使用单个主键还是组合主键的建议?
我们有许多现有的独立的基于项目的数据库,但从未将它们组合成一个数据库,即使它们遵循相同的结构。
所有表格都基于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将相当直接,并且项目代码和项目编号在组合使用时会成为一个自然的关键字。在任何记录中,它们都会一起出现,并且是唯一的。
但是我应该使用哪种方法呢?
发布于 2013-05-31 23:25:44
对于您的条目列表表,我认为您可能需要一个复合主键,因为您将在此数据库中列出多个项目,并且由于条目代码不是唯一的,因此您需要将其与项目代码组合以唯一标识它。
如果您没有组合键,并且您试图仅映射到不唯一的时间代码,那么当您查询数据库时,您将得到所谓的笛卡尔乘积--无用的行、行和行。
数据建模非常有趣,一个建模良好的数据库非常值得花时间去做正确的事情。网上有一些书,可能还有一些教程,可以帮助你做到这一点,而且阅读起来不会花太多时间。
希望这能有所帮助。
https://stackoverflow.com/questions/16859541
复制相似问题