2011-06-15 85 views
1

我有一个数据库设计,使用复合主键来确保唯一性,哪些也是外键。MySQL - 自动增量+复合主键 - 性能和完整性

这些表然后以相同的方式链接到其他表,以便最终复合键可以达到4或5列。这导致了一些相当大的JOIN,所以我认为一个简单的解决方案是使用一个自动增量列,它不是主键的一部分,而是用作其他表的主键的一部分。

下面是该总体布局一些伪代码:

CREATE TABLE Item (
id AUTO_INCREMENT, 
... 
PRIMARY KEY (id) 
) ENGINE = InnoDB; 

CREATE TABLE PriceCategory (
id AUTO_INCREMENT, 
... 
PRIMARY KEY (id) 
) 

CREATE TABLE ItemPriceCategory (
itemId, 
priceCategoryId, 
id AUTO_INCREMENT, 
... 
UNIQUE INDEX id, 
PRIMARY KEY (eventId, priceCategoryId) 
) 

CREATE TABLE ClientType (
id AUTO_INCREMENT, 
... 
PRIMARY KEY (id) 
) 

CREATE TABLE Price (
itemPriceCategoryId, 
clientTypeId, 
id AUTO_INCREMENT, 
... 
UNIQUE INDEX id, 
PRIMARY KEY (itemPriceCategoryId, clientTypeId) 
) 

table Purchase (
priceId, 
userId, 
amount, 
PRIMARY KEY (priceId, userId) 
) 

表的名称已被更改,以保护无辜;-)而且实际的布局中引用的条款深入一点。

所以,我的问题是,从性能和数据完整性的角度来看,这是一个可行的策略吗?从Purchase表中的所有引用表中获取所有密钥会更好吗?

在此先感谢。

+0

类似于独立的键:http://stackoverflow.com/questions/6372058/MySQL的原色的键合一个关系标签le-unique-id-or-multiple-unique-key/ – 2011-06-16 12:53:46

回答

5

通常,关于主键的建议是让一个列具有“无意义的”,不可变的主键。自动递增整数很好。

所以,我会扭转你的设计 - 你的连接表也应该有无意义的主键。例如:

CREATE TABLE ItemPriceCategory (
itemId, 
priceCategoryId, 
id AUTO_INCREMENT, 
... 
PRIMARY KEY id, 
UNIQUE INDEX (eventId, priceCategoryId) 
) 

这样一来,在价格上itemPriceCategoryId列是正确的外键,链接到ItemPriceCategory表的主键。

然后,您可以使用http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html外键来确保数据库的一致性。

在性能,从广义上讲而言,这种策略应该比联接查询复合键,可快速,但具有良好索引的数据库,你实际上可能没有注意到其中的差别...

+0

我喜欢这个解决方案,简单而有效。尽管如此,让我看看别人在接受之前可以贡献什么。 – 2011-06-15 13:50:26

2

我认为,在这里翻译的东西已经丢失了,但我尽了最大努力制作了这个图表。

一般来说,有两种方法。第一个是传播密钥,第二个是对每个表都有一个自动增量整数作为PK

第二种方法通常通过它们使用DB作为对象的持久性存储ORM工具驱动,而第一个(使用密钥传播)更常见的是手工制作的DB设计。

通常,具有关键传播的模型为“随机查询”提供更好的性能,主要原因是您可以在连接中“跳过表”。例如,在具有关键传播的模型中,您可以将Purchase表直接加入Item表,以便通过ItemName报告购买。在另一个模型中,您将不得不加入PriceItemPriceCategory表格 - 只需要进入ItemID即可。

基本上,具有关键传播的模型基本上是关系型的,而另一个是对象驱动的。 ORM工具可以选择或强制使用单独的ID(第二种情况),但为开发提供其他优势。

你的例子似乎试图使用这两种组合 - 不一定是坏的,它会帮助你,如果你可以与原设计师谈话。


随着键传播

enter image description here


为每个表 enter image description here

+0

感谢您花时间制作图表。我正在与原始数据库的设计师合作来改进它。这个想法的确是为了获得两全其美的方法,我们希望具有良好的数据完整性,并以ORM方式使用表格,特别是AR设置。拥有autoinc ID在AR中非常有用,因为它可以立即了解对象的状态,但我们不希望完全信任PHP来保持数据的完整性。 – 2011-06-15 13:45:17