【问题标题】:MySQL - autoincrement + compound primary key - performance & integrityMySQL - 自动增量 + 复合主键 - 性能和完整性
【发布时间】:2011-06-15 20:33:05
【问题描述】:

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

这些表然后以相同的方式链接到其他表,因此最终复合键最多可以得到 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 表中包含所有引用表中的所有键是否更好?

提前致谢。

【问题讨论】:

标签: mysql database-design


【解决方案1】:

一般来说,关于主键的建议是使用“无意义”、不可变的主键和单列。自动递增整数很好。

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

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

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

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

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

【讨论】:

  • 我喜欢这个解决方案,简单有效。在接受之前让我看看其他人可能会做出什么贡献。
【解决方案2】:

我认为这里的翻译中遗漏了一些东西,但我尽力制作了一个 ER 图。

一般来说,有两种方法。第一个是传播键,第二个是有一个自增整数作为每个表的 PK

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

一般来说,具有键传播的模型为“随机查询”提供了更好的性能,主要是因为您可以在连接中“跳过表”。例如,在具有密钥传播的模型中,您可以将Purchase 表直接连接到Item 表以报告ItemName 的购买情况。在另一个模型中,您也必须加入PriceItemPriceCategory 表——只是为了到达ItemID

基本上,具有密钥传播的模型本质上是关系型的——而另一种是对象驱动的。 ORM 工具更喜欢或强制执行具有单独 ID 的模型(第二种情况),但为开发提供了其他优势。

您的示例似乎试图使用这两者的某种组合 - 不一定是坏事,如果您可以与原始设计师交谈会有所帮助。


通过密钥传播


每个表的独立键

【讨论】:

  • 感谢您花时间制作图表。我正在与原始数据库的设计者一起改进它。这个想法确实是为了获得两全其美的方法,我们希望具有良好的数据完整性并以 ORM 方式使用表,特别是 AR 设置。拥有 autoinc ID 在 AR 中非常有用,因为它可以立即知道对象的状态,但我们不想仅仅信任 PHP 来保持数据完整性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2012-06-21
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多