数据库设计:替代复合键?

kgr*_*rad 3 sql interbase database-design data-modeling

我正在构建一个数据库系统,并且我的一个表的设计有问题.

在该系统中,有一个用户表,一个对象表,一个项表和一个成本表.

成本表中的唯一记录由用户,对象,项目和年份确定.但是,如果项目不同,则可能有多个记录具有相同的年份.

层次结构为user-> object-> item-> year,每个项目有多个唯一年份,每个对象有多个唯一项目,每个用户有多个唯一对象,多个唯一用户.

设计成本表的最佳方法是什么?

我想将userid,objectid和itemid包含为外键,然后使用由userid,objecid,itemid和costyear组成的复合键.我听说复合键是糟糕的设计,但我不确定如何构建它以摆脱使用复合键.你可以告诉我的数据库建设技巧有点生疏.

谢谢!

PS如果重要,这是一个interbase数据库.

Ste*_*ger 13

要避免使用复合键,只需定义代理键即可.这具有人为值,例如自动计数器.

您仍然可以(并且应该)在这些列上定义唯一约束.

顺便说一下:它不仅建议不使用复合键,还建议使用代理键.在你的所有表格中.


Mat*_*nes 6

使用内部生成的密钥字段(称为代理键),类似于CostID,用户永远不会看到,但将唯一标识Cost表中的每个条目(在SqlServer中,像uniqueidentifier或IDENTITY这样的字段可以解决这个问题.)

  • @kgrad:在这种情况下,在这4行上定义唯一约束或唯一索引,以确保它们是唯一的,并且不能插入具有相同值的其他行 (3认同)