数据库:如何将 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?
我正在设计一个关系数据库,我想知道以下问题的最佳实践:
我有一个名为 "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?