【问题标题】:Database Design: Multiple join tables or one table with identifying 'table' column数据库设计:多个连接表或一个带有标识“表”列的表
【发布时间】:2023-03-30 20:38:01
【问题描述】:

我正在设计一个可以标记任何内容的数据库,并且我可能希望能够选择具有特定标记的所有内容。

我在以下两个选项中苦苦挣扎,希望得到一些建议。如果有更好的方法请告诉我。

选项 A
多个“多对多”连接表。

标签: ID 标签 媒体: ID 标题 源代码 创建 媒体标签: ID media_id tag_id 文章: ID 标题 内容 创建 文章标签: ID article_id tag_id

选项 B
单个“标记引用”表,它使用“表”列来标识要连接到哪个表。

标签: ID 标签 标签参考: ID row_id tag_id 桌子 媒体: ID 标题 源代码 创建 文章: ID 标题 内容 创建

从维护的角度来看,选项 B 似乎有利,但考虑到 SQL 查询选择所有内容,并且认为没有多个查询是不可能的。

【问题讨论】:

  • 我会选择第一个。将表名存储为列并不是一个好主意。恕我直言。
  • 看看这个:stackoverflow.com/questions/3579079/…。您的问题是一般继承问题的一个具体实例......

标签: mysql database database-design


【解决方案1】:

选项 B 包含多值依赖 - 因此违反了4th normal form。我更喜欢选项A

【讨论】:

    【解决方案2】:

    第二个选项几乎会阻止您使用任何 JOIN 来实现高效 SQL,从而迫使您使用缓慢的多选。

    所以我会说第一个选项更可取。

    【讨论】:

    • 当然,即使在使用 选项 B 中的布局时,仍然可以加入表格。也许效率不高,每次都必须将表名作为搜索参数传递。
    • 只有当您事先知道要连接哪个表,或连接 SQL 中所有可能的表时。
    【解决方案3】:

    实际上,这取决于每个 sql 开发人员。但我更喜欢Option A,因为您可以很容易地知道表中的某个列是另一个表的foreign key假设它是真的)。

    Option B 的设计有点糟糕,因为将表名存储在列中是个坏主意。您可以在此处花费更多 IFCASE

    【讨论】:

      【解决方案4】:

      使用选项 B 时,您无法为其他表设置外键。因此,我会选择 Option A 并为每个 m:n 关系创建一个表。

      “从维护的角度来看选项 B” – 是一场噩梦。如果你删除一篇文章会发生什么?带有row_id 的所有行都将保留在tag_reference 表中。您总是需要手动更新这些条目。

      【讨论】:

      • 感谢您的回答,这完全有道理。选项 A 是赢家
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2021-11-29
      • 2014-04-24
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多