3

我正在构建一个数据库系统,但在设计我的一张表时遇到了问题。

在这个系统中有一个用户表、一个对象表、一个项目表和一个成本表。

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

层次结构为用户->对象->项目->年份,每个项目多个唯一年份,每个对象多个唯一项目,每个用户多个唯一对象,多个唯一用户。

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

我正在考虑将 userid、objectid 和 itemid 作为外键,然后使用由 userid、objecid、itemid 和 costyear 组成的复合键。我听说复合键的设计很糟糕,但我不确定如何构造它以摆脱使用复合键。如您所知,我的数据库构建技能有点生疏。

谢谢!

PS如果重要的话,这是一个interbase db。

4

3 回答 3

13

为了避免复合键,您只需定义一个代理键。这包含一个人工值,例如一个自动计数器。

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

顺便说一句:它不仅建议不要使用复合键,还建议使用代理键。在你所有的桌子上。

于 2009-10-07T15:48:20.817 回答
6

使用内部生成的键字段(称为代理键),例如 CostID,用户永远不会看到,但会唯一标识 Cost 表中的每个条目(在 SqlServer 中,uniqueidentifier 或 IDENTITY 之类的字段可以解决问题。)

于 2009-10-07T15:47:37.513 回答
0

尝试使用您概述的列使用复合键构建您的数据库,看看会发生什么。你可能会感到惊喜。确保这四列中没有丢失的数据,并确保所有四列中没有两行具有相同的值,这将有助于保护数据的完整性。

声明复合主键时,声明中列的顺序不会影响声明的逻辑结果。但是,DBMS 为您构建的复合索引也将具有相同顺序的列,并且复合索引中的列顺序确实会影响性能。

对于仅指定其中一个、两个或三个列的查询,如果索引中的第一列是查询中未指定的列,则索引将无用。如果您事先知道您的查询对我有什么影响,以及哪些查询最需要快速运行,这可以帮助您以正确的顺序声明主键的列。在极少数情况下,创建两个或三个额外的一列索引可以加快某些查询,但会减慢更新速度。

于 2009-10-09T14:15:33.680 回答