数据库:如何将 ID 关联到每个 table? (多对多对多!)

Database: How do I relate an ID to EVERY table? (many to many to many!)

我正在设计一个关系数据库,我想知道以下问题的最佳实践:

我有一个名为 "links" 的 table,其中包含 URL。

我的大多数其他 table 都与出现在我整个过程中的对象有关 站点,例如 "news"、"music"、"banners" - 这些与 通常的一对多或多对多关系。到目前为止 好...

链接 table (link_id) 几乎可以应用于我的任何对象。为了 例如,"news" 可能有许多 "link_id, one "link_id" 可以应用 许多 "music"。许多 "banners" 可以共享许多 "link_id" - 链接 对我的网站很重要!

我可以想到两个解决方案:

1) 为应用"link_id"的每个新对象创建一个连接table,从而创建几十个新的table,并且每次添加新对象时都会添加新的table反对我的申请。

>##*Table: links_to_news*##

>##*Table: links_to_music*##

>##*Table: links_to_banners*##

> etc... etc... etc...

2) 在单个新 table 中引用 table 名称,并创建一个连接,即:

>##Table: links##

>| link_id | link_url |

>##*Table: links_to_tables* ##
>*| link_id | a_table_name | id_within_that_table |*

> ##Table: news##

>| news_id | news_text | 

> ##Table : music ##

>| music_id | music_text | 

我觉得这两种方法都有点笨拙。那么有没有正确的方法来做我需要的?谢谢。

您正在尝试实现多态 relation/assocation。第一个选项很难maintain/extend。第二种选择更灵活,但不允许使用外键,这可能是不可取的。

在这种情况下,您需要考虑第三种解决方案。您将需要一个 "supertable" 为所有可以有链接的对象存储一个全局唯一 ID。例如,table 可以称为 linkables。它只有一列(唯一的自动递增 ID)。每个table(新闻、音乐等)都有一个linkable_id列,这是一个外键。在 OOP 术语中,您正在使您的新闻、音乐 (...) class 继承自(抽象的)可链接 class。然后你创建一个结 table (linkable_id, link_id).

基本上,您正在将 "link" 关系移动到 "parent" table,从而消除多态性。

推荐读物:

  • Foreign key to one of many tables?
  • Why can you not have a foreign key in a polymorphic association?