我应该选择以下两种数据库设置中的哪一种?

时间:2010-12-03 03:26:54

标签: php mysql database database-design

我有3种类型的内容:博客,新闻稿和提醒。它们都有bodyentered 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表不仅会typetype id链接到专用表,content表也会有bodyentered 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 idcontent 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

我应该选择哪个?我认为第一个结构更好,因为我可以搜索所有内容,无论是博客还是新闻稿或特定单词的提醒。如果我想搜索仅blogspress releases可用的{{1}},我仍然需要查看其他表格,但是......

那么哪种结构更好,为什么你这么想?我也愿意接受与这些不同的其他想法或改进。

4 个答案:

答案 0 :(得分:3)

第一种结构是经典的超类型 - 子类型方法,并推荐使用。我建议使用像ContentID这样的完整table-name-id来命名主键,以避免混淆。

alt text

答案 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)

我认为你应该考虑常见的领域。 他们真的需要匹配吗?

如果需要匹配,只需将其放在一个表中即可。