2010-03-29 51 views
0

我有一个3字段的表:颜色,水果,日期。我可以选择1种水果和1种颜色,但每天只能做一次。数据库表设计与易用性。 (复合PK?)

例子:

  1. 红,苹果,周一
  2. 红,芒果,周一
  3. 蓝色,苹果,周一
  4. 蓝色,芒果,周一
  5. 红,苹果,周二

我可以建立表格的两种方式是:

1.-要使颜色,水果和日期成为复合主键(PK)。这样可以很容易地将数据插入表中,因为所有需要的验证都是由数据库完成的。

  • PK颜色
  • PK水果
  • PK日期

2:已经和id列设置为PK,然后所有其他领域。许多人都这样说,因为复合PK是邪恶的。例如,CakePHP不支持它们。

  • PK ID
  • 颜色
  • 水果
  • 日期

两者都有优点。这将是更好的方法?

+0

Duplicate:http://stackoverflow.com/questions/1823685/database-when-should-i-use-a-composite-index – ChristopheD 2010-03-29 21:25:07

回答

3

我其实更喜欢第二种选择,ID列作为“代理”主键。大多数数据库专家可能会说你应该在表中寻找“自然关键”(可能是复合),但我认为使用单列代理PK更容易,特别是在使用ORM时。即使ORM支持组合键,使用代理键仍然更容易。对于使用ID的表编写查询也比使用组合键更容易。

您可以使用唯一约束来实现这三列中唯一性的数据库内验证。

+0

PK +独特索引(颜色,水果,日期) – givanse 2010-04-18 19:46:14

2

“最佳”方法是#2。

为什么? “复合PK是邪恶的”。他们通常没有多大帮助。从处理器很小,磁盘很小,每个索引都很珍贵的那些日子开始,它们就成了一个暂时搁置的过程。在你的三列和一个单独的代理主键上有独特的索引约束更简单。另外,当你有一个单独的代理PK时,你所有的数据都可以被更新而不会中断数据的参照完整性。

既然你已经知道,为什么要发表这个问题?

+0

这就是我阅读关于PK的同时阅读CakePHP。我对他们没有任何评价。 – givanse 2010-04-18 19:49:10

1

如果您使用的是支持复合PK的ORM /框架(不包括任何),并且您不需要在另一个表中将其设置为FK,则使用复合PK。否则,使用autoinc PK并且创建其他字段的复合唯一键。

2

您可以通过在第二个示例的三个on-PKey列上设置唯一索引来“强制”进行相同类型的唯一性验证。例如。创建一个包含所有三个字段并将其设置为唯一的索引。 (不要在该索引中包含pkey!)