数据库设计 - 一个链接表还是多个链接表?

时间:2010-05-10 03:30:54

标签: mysql data-modeling innodb

我正在为一个数据库的前端工作,其中每个表与所有其他表基本上有多对多的关系。

我不是数据库管理员,只是一些基本的DB课程。根据我的理解,在这种情况下,典型的解决方案是连接每个“真实”表的多个链接表。以下是我提出的建议:一个链接表,它具有与其他表的所有其他PK的外键依赖关系。

有什么理由在可扩展性,灵活性等方面可能会出现严重后果吗?

4 个答案:

答案 0 :(得分:1)

如果我理解你的提议正确,那么你想要做的就是对“一个真实的查询表”(OTLT)的一个小变化,这不是一个好主意。在这种情况下,也许,OTLT代表“One True Linking Table”。

当您需要维护OTLT的参照完整性时会出现问题。对于初学者来说,它的架构是什么?

ReferencingTable     INTEGER (or VARCHAR(xx)?)
ReferencingId        INTEGER
ReferencedTable      INTEGER (or VARCHAR(xx)?)
ReferencedId         INTEGER

必须观看表格ID。它们可以是系统目录中值的副本,但您必须担心重建表时会发生什么(通常,表ID更改)。或者它们可以是单独控制的值 - 一组平行的表格。

接下来,您必须担心应该是对称设置的列命名的不对称性; OTLT将Table1连接到Table2,就像Table2到Table1一样 - 除非您的关系确实是不对称的。这只会让生活变得非常复杂。

现在,假设您需要将主表Table1连接到Table2和Table2连接到Table3,每个表都通过OTLT连接,表ID分别为1,2和3,并且'ReferencingTable'总是小于OTLT中的两个:

SELECT T1.*, T2.*, T3.*
  FROM Table1 AS T1
  JOIN OTLT   AS O1 ON T1.Id = O1.ReferencingId AND O1.ReferencingTable = 1
  JOIN Table2 AS T2 ON T2.Id = O1.ReferencedId  AND O1.ReferencedTable  = 2
  JOIN OTLT   AS O2 ON T2.Id = O2.ReferencingId AND O2.ReferencingTable = 2
  JOIN Table3 AS T3 ON T3.Id = O2.ReferencedId  AND O2.ReferencedTable  = 3

所以,在这里你通过OTLT有两套独立的连接。

替代配方为每对使用单独的连接表。这些连接表中的行较小:

ReferencingID    INTEGER
ReferencedID     INTEGER

并且,假设连接表名为Join_T1_T2等,上面的查询变为:

SELECT T1.*, T2.*, T3.*
  FROM Table1     AS T1
  JOIN Join_T1_T2 AS J1 ON T1.Id = J1.ReferencingId
  JOIN Table2     AS T2 ON T2.Id = J1.ReferencedId
  JOIN Join_T2_T3 AS J2 ON T2.Id = J2.ReferencingId
  JOIN Table3     AS T3 ON T3.Id = J2.ReferencedId

对表(5)的引用与以前一样多,但DBMS可以自动维护这些连接表的引用完整性 - 而维护必须与OTLT一起手动编写。连接更简单(没有AND子句)。

在我看来,这对OTLT系统有很强的影响力,并且有利于为主要表格的每个重要配对提供专门的链接表。

答案 1 :(得分:0)

所以你试图决定是采用星形模式还是星号模式?

我当然主张星号。就像在代码中一样,通常有一个驱动程序方法,如果模式如您所述,应该有一个驱动程序表。查看每个“主”表所需的表总数:

Main   Junct  Total
-------------------
   2       1      3
   3       3      6
   4       6     10
   5      10     15
   6      15     21
   7      21     28!

7可能是数据库模式中最多的。

此外,通过这种方式,您可以执行涉及3个主表的复杂查询,而无需通过3个联结表,而只需触摸一个联结表,无论​​您需要多少主表。

可扩展性?没有。 灵活性?只有您的架构发生了巨大变化。

答案 2 :(得分:0)

单个链接表的主要问题是“链接”突然变成了一个实体。例如,您可能拥有“购物者”和“商店”实体。这可以是多对多的,因为购物者可以去许多商店,商店会有很多购物者。

下个月,您决定要记录购物者在商店中花费的金额。突然之间,您必须在通用链接表中添加“购买”金额,或者重建应用程序的大部分以使用该链接的特定链接表而不是通用链接表。

答案 3 :(得分:0)

此设置有两个选项。

  • 确保每行指示仅指向一个表的链接。这是一个具有单独连接表的简并模型。
  • 确保您拥有高度扩大表格大小的所有链接组合。如果主表中的一行连接到其他三个表中的每一个中的4,5和6条记录,则在连接表中需要4 * 5 * 6 = 120行。您还需要逻辑来处理表的连接。如果您只需要加入第一个表,则需要过滤掉120行,直到4行。

在某些情况下,您将拥有多个表关系,但这些将由设计驱动。 Releationships经常包含开始和结束日期等信息。这对于一个真正的查找表来说是有问题的,因为您需要为每个可能的关系携带列。