【问题标题】:In MySQL, what are the pros and cons of these two approachs to junction tables?在 MySQL 中,这两种连接表方法的优缺点是什么?
【发布时间】:2010-12-07 08:26:49
【问题描述】:

刚刚发现映射多对多关系的唯一方法似乎是通过junction table。就我提出的两种方法的优缺点寻求建议。

SAMPLE_DATABASE:

table_01
-- table_01_id (pk)
-- table_01_data

table_02
-- table_02_id (pk)
-- table_02_data

连接表 (1)

junction_id (pk)
table_01_id (fk)
table_02_id (fk)

连接表 (2)

table_01_id (pk)
table_02_id (pk)

猜测联结表 (2) 是可行的方法,但有兴趣知道原因。

谢谢!

【问题讨论】:

标签: sql mysql


【解决方案1】:
【解决方案2】:

Junction 表 (1) 中的 junction_id (pk) 没有意义。拥有它是一种浪费,所以不要。

【讨论】:

  • 虽然对模式没有意义,但它强制执行表的任意物理写入顺序。复合键在插入和 B+-tree 平衡方面有一些额外的复杂性。但是,总的来说,您应该使用两列作为非集群 PK,并且只有在开始遇到由索引维护问题引起的 I/O 问题时才添加集群标识/序列列。
  • @Jeremiah Peschka:太好了,谢谢——这就是我一直在寻找的信息,我也猜到了答案。
  • @Jeremiah- 但您可能希望在 table_01_id, table_02_id 上使用复合索引和唯一约束,但仍需维护。
  • @Martin - 没错,但是在索引支持的表中维护 B+-trees 比在堆表上维护 B+-trees 快得多。如果您不提供任意聚类列,并且您将 PK 标记为非聚类,MySQL 会尝试通过添加任意聚类列来解决此问题。无论哪种方式,在 MySQL 中将您的 PK(在这种情况下为唯一的复合索引)标记为非集群是一件非常安全的事情......直到他们在不告诉我们的情况下改变行为。
猜你喜欢
  • 2011-11-01
  • 2012-04-29
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多