我有3种类型的内容:博客,新闻稿和提醒。它们都有body
和entered by
个字段。博客和新闻稿都有一个title
字段,提醒者缺少该字段,提醒内容包含hour
字段,博客和新闻稿缺少该字段。这就是表格格式的样子,所以你很容易看到......
blog press release reminder
---------------------------------------------------
entered by field yes yes yes
body field yes yes yes
title field yes yes --
time field -- -- yes
我正在创建一个名为content
的主表,该主表连接到专门的表blogs
press releases
reminders
。我想到了2个结构
第一个结构......我使用的内容管理系统就是这样做的,但我不想盲目跟随他们的步骤,因为我的需求不一样。将所有共享字段放在主content
表中。因此,content
表不仅会type
和type id
链接到专用表,content
表也会有body
和entered by
等公共字段content table B=blogs table PR=press releases table R=reminders table
------------------------------------------------------------------------------
id id id id
type=B/PR/R title title hour
type id
body
entered by
。其他3个表只有它们唯一的字段。
content
第二种结构。 type
表只有type id
和content table B=blogs table PR=press releases table R=reminders table
------------------------------------------------------------------------------
id id id id
type=B/PR/R entered by entered by entered by
type id body body body
title title hour
链接到其他3个表,这意味着公共字段在3个表中重复。
title
我应该选择哪个?我认为第一个结构更好,因为我可以搜索所有内容,无论是博客还是新闻稿或特定单词的提醒。如果我想搜索仅blogs
和press releases
可用的{{1}},我仍然需要查看其他表格,但是......
那么哪种结构更好,为什么你这么想?我也愿意接受与这些不同的其他想法或改进。
答案 0 :(得分:3)
第一种结构是经典的超类型 - 子类型方法,并推荐使用。我建议使用像ContentID
这样的完整table-name-id来命名主键,以避免混淆。
答案 1 :(得分:2)
第一个是更好的构造,它允许内容在内容表中具有一组特定的必需或公共数据,然后在子表中具有专用数据。这也允许您在将来添加更多类型,其他需求仍然可以重用内容中的公共元素,但保留任何唯一数据。
另一个关键问题是,如果需要这些数据,例如,所有提醒都需要一个小时,并且所有博客/新闻稿都需要标题。如果需要它们,则确保始终填充这些子表。如果他们不是那么也许你应该看看扁平化结构(是弗吉尼亚,你有时应该非规范化)。
所以你的内容表就变成了(nn = not null,n = nullable) id(nn),类型id(nn),type(nn),body(nn),由(nn),title(n),hour(n)输入。我通常发现这样做的主要原因是,如果您创建的不同数据实体非常相似,那么随着时间的推移,它们可能会合并。例如,此时的提醒不需要标题,但将来可能需要。
答案 2 :(得分:1)
我很快就会没有任何类型的“类型”字段,而是制作四个表:内容,博客,新闻发布和提醒。内容具有输入,正文和标题的公共字段。对于每个博客,新闻发布和提醒,他们都有一个id是主键,也是内容id的外键。这使得1:1“is-a”关系。提醒可以有额外的时间字段。要确定内容行的条目类型,请执行连接选择。
这在性能方面可能不是最好的,但它更好地规范化。
答案 3 :(得分:0)
我认为你应该考虑常见的领域。 他们真的需要匹配吗?
如果需要匹配,只需将其放在一个表中即可。