Database design 如何为CMS设计资产表(二对多关系?)

Database design 如何为CMS设计资产表(二对多关系?),database-design,content-management-system,Database Design,Content Management System,我正在为一个简单的CMS(如网络应用程序)开发一个数据库。基本上,它由内容组的一部分内容组成。就像是页面的一部分的文本片段。为此,我想到了一个页面表格和一个文本表格,它们之间的关系为1:n 问题是,我还希望资产链接到页面或文本。因此,一段文本可以有一个链接到它的缩略图,但一个页面也可以有一个链接到它的缩略图。不知怎的,我就是不知道该怎么做才好。我是否应该使用collumnspageId和textId创建一个assets表,并确保每行仅使用其中一个?我觉得有点奇怪。。还是我只需要制作两个不同的资产

我正在为一个简单的CMS(如网络应用程序)开发一个数据库。基本上,它由内容组的一部分内容组成。就像是页面的一部分的文本片段。为此,我想到了一个
页面
表格和一个
文本
表格,它们之间的关系为1:n

问题是,我还希望资产链接到页面或文本。因此,一段文本可以有一个链接到它的缩略图,但一个页面也可以有一个链接到它的缩略图。不知怎的,我就是不知道该怎么做才好。我是否应该使用collumns
pageId
textId
创建一个
assets
表,并确保每行仅使用其中一个?我觉得有点奇怪。。还是我只需要制作两个不同的资产表


希望你们能帮我

资产是独立的,并且可能在任何页面上都完全不使用它们。例如,想象一个已经上传到服务器上的图形

类似地,您可能拥有在多个页面上重用的资产。图形当然会出现在脑海中,但也有一些锅炉板文本、广告或任何其他常见元素

因此,您的问题在于资产表上没有互斥的外键。您的问题是资产表上有任何外键


相反,您应该有一个将
资产
映射到
页面的交集表(多对多)。如果您有多个东西可以使用资产,则为每个使用资产的东西都有一个交集表。

通常有两种方法来处理这种情况:

  • 或者制作专属FK(正如您已经发现的)
  • 或者使用继承和一个FK,就像这样
  • …但是,如果只有两个子表,这可能是一种过分的做法。OTOH,随着关系两侧表的数量增加,此方案可以避免“关系乘法”,例如:


    有关如何在关系数据库中实现继承的一些提示,请参阅。

    Wow!真棒的回答!谢谢事实上我是这样做的。但Joels的回答让我怀疑,是否应该有一个交集表来保留在多个项目上使用资产的选项。所以一个组合将是完美的@Raapwerk这实际上取决于您的需求,并且与上面的结构“正交”——您可以有连接表,或者继承,或者两者都有!正如我上面所说,我完全同意。这种关系更有意义。继承关系数据库对我的应用程序来说也很有意义,所以我选择组合。拥有一个交集表感觉也更干净。谢谢