我正在构建一个数据库系统,并且无法设计其中一个表。
在这个系统中有一个用户表,一个对象表,一个项目表和成本表。
成本表中的唯一记录由用户,对象,项目和年份决定。但是,如果项目不同,则可能有多个记录具有相同的年份。
层次结构变为user-> object-> item-> year,每个项目多个唯一年份,每个对象多个唯一项目,每个用户多个唯一对象,多个唯一用户。
设计成本表的最佳方法是什么?
我想将userid,objectid和itemid包含为外键,然后使用由userid,objecid,itemid和costyear组成的复合键。我听说复合键是糟糕的设计,但我不确定如何构建它以摆脱使用复合键。正如你可以告诉我的数据库建设技巧有点生疏。
谢谢!
P.S。如果重要,这是一个interbase数据库。
答案 0 :(得分:13)
要避免使用复合键,只需定义代理键即可。这包含一个人为值,例如自动计数器。
您仍然可以(并且应该)在这些列上定义唯一约束。
顺便说一句:它不仅建议不使用复合键,还建议使用代理键。在你的所有表格中。
答案 1 :(得分:6)
使用内部生成的密钥字段(称为代理键),类似于CostID,用户永远不会看到,但会唯一标识Cost表中的每个条目(在SqlServer中,像uniqueidentifier或IDENTITY这样的字段可以解决这个问题。)
答案 2 :(得分:0)
尝试使用您列出的列完全使用复合键构建数据库,看看会发生什么。你可能会感到惊喜。确保这四列中没有丢失的数据,并确保所有四列中没有两行具有相同的值将有助于保护数据的完整性。
声明复合主键时,声明中列的顺序不会影响dclaration的逻辑结果。但是,DBMS为您构建的复合索引也将具有相同顺序的列,并且复合索引中的列顺序确实会影响性能。
对于仅指定其中一列,两列或三列的查询,如果索引中的第一列是未在查询中指定的列,则索引将无效。如果您事先知道您的查询是如何形成的,以及哪些查询最需要快速运行,这可以帮助您按正确的顺序声明主键的列。在极少数情况下,创建两个或三个额外的一个列索引可以加快某些查询,但代价是减慢更新速度。