【发布时间】:2012-06-23 04:37:13
【问题描述】:
假设我们有一个表来存储用户最喜欢的图片,并带有一个复合主键对(UserId,PictureId)。书籍通常说在这种情况下您需要一个基于 (UserId, PictureId) 的复合索引,它通常在 WHERE 子句中显示为 (UserId=103 AND PictureId=1234)。但我认为 dababase 引擎应该足够聪明,可以分别使用基于两列的两个单独的索引。只需从每个索引中获取一组行号,然后找到两组中都存在的行号。这样,就不需要复合索引了。
那么,实际上数据库引擎可以做到这一点吗?
【问题讨论】:
-
如果您使用的是复合 PK,那么您的所有 FK 都需要包含 all PK - 句点的列。毕竟:如果您使用这两列作为您的 PK,那么只有这两列的 组合 才能唯一标识一行 - 对吧?如果不是:那么您的 PK 是错误的 - 也许您甚至不需要复合 PK - 单独的一列将可靠且唯一地每一行?然后只使用那一列作为您的 PK。
-
@marc_s:这是表之间“多对多”关系的情况,您需要第三张表作为中间的复合主键。
-
好的,但在这种情况下 - 您需要在
UserID上创建一个索引,在PictureId上创建第二个单独的索引(以加快 JOIN 到所涉及的其他表的速度),您可能需要一个(UserID, PictureId)对的唯一约束以避免重复。在这种情况下,在我看来,两列上的 复合主键 没有意义。
标签: sql