MySQL - 自动增量+复合主键 - 性能和完整性

ian*_*aré 1 mysql database-design

我有一个数据库设计,它使用复合主键来确保唯一性,也是外键.

然后以相同的方式将这些表链接到其他表,以便最后复合键最多可以有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)
)
Run Code Online (Sandbox Code Playgroud)

表的名称已被更改以保护无辜;-)而且实际布局在引用方面稍微深一些.

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

提前致谢.

Nev*_*uyt 5

通常,对主键的建议是使用单列的"无意义",不可变主键.自动递增整数很好.

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

CREATE TABLE ItemPriceCategory (
itemId,
priceCategoryId,
id AUTO_INCREMENT,
...
PRIMARY KEY id,
UNIQUE INDEX  (eventId, priceCategoryId)
)
Run Code Online (Sandbox Code Playgroud)

这样,price中的itemPriceCategoryId列是一个正确的外键,链接到ItemPriceCategory表的主键.

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

就性能而言,从广义上讲,这种策略应该比在连接中查询复合键更快,但是如果索引良好的数据库,您实际上可能没有注意到差异......