想象一下,您有一个平台,用户可以在其中编写文章。这些文章根据其类型分为两个不同的表:您有type1和type2文章。对于每种类型的文章,您需要使用不同的列,并且您需要对它们进行稍有不同的处理,因此为什么要将它们分成两个表。
尽管将这两种类型的文章保存在两个单独的表中,但是您希望将它们的主键用作表中同一列上的外键,其中,文章的类型无关紧要,例如跟踪他们的观点,最爱,喜欢/不喜欢,旗帜,无论您拥有什么。看起来可能像这样:
id | type | articleId | whatever
===+======+===========+=========
1 | 1 | 1 | ...
---+------+-----------+---------
2 | 2 | 1 | ...
---+------+-----------+---------
3 | 1 | 2 | ...
---+------+-----------+---------
“类型”基本上定义了应将“ articleId”加入哪个表,这意味着类型和articleId组合在一起始终是唯一的。
这有什么利弊?这种表将随着时间的增长而迅速增长,我担心如果您必须基于其他列联接表,这可能会大大降低查询速度。我是否应该为每种商品类型保留单独的表格,以便收藏,查看图片等等?
答案 0 :(得分:1)
有条件的加入目标对我当然并不理想。在这种情况下,我不确定RDBMS是否可以保持完整性。而是考虑一种方法,将标识符集中在一种超级表中,然后让所有其他表引用该标识符。
例如,考虑一个文章表:
Articles
--------
ID (PK, IDENTITY)
(any other info common to all articles)
然后您的不同“类型”具有对应的FK:
Type1Articles
--------
ID (PK, FK to Articles)
(info about type 1 articles)
Type2Articles
--------
ID (PK, FK to Articles)
(info about type 2 articles)
扩展文章信息的其他表可以引用相同的超级表。例如,如果您有一个多对多表将任何类型的文章链接到标签,比如说:
ArticleTags
--------
ArticleID (PK, FK to Articles)
TagID (PK, FK to Tags)
或者也许您有一个表,该表具有多对多表,该表仅将 应用于给定类型的文章。您仍然可以引用该表,并且约束条件将全面适用:
Type1ArticleWidgets
--------
ArticleID (PK, FK to Type1Articles)
WidgetID (PK, FK to Widgets)
基本上,从通用描述Article
的信息开始(即使唯一通用的信息只是键标识符),然后将其他子表挂在该表之外。