我可以像这样为我的CMS创建数据库设计吗?

时间:2018-01-20 16:33:33

标签: sql .net database-design entity-relationship

我正在设计标准的CMS数据库结构。 这些是我的实体表:

ServicesPage
  --ServicesPageId
  --HeaderTitle
  --HeaderParagraph
AboutPage
  --AboutPageId
  --HeaderTitle
  --HeaderParagraph
ContentColumns (A section that can belong to pages)
  --Id
  --Title
  --Paragraph
  --Image
  --FK_PageId

......和其他页面

  • ServicesPage包含许多ContentColumns
  • ContentColumns仅属于一个ServicesPage
  • AboutPage有很多ContentColumns
  • ContentColumns仅属于一个AboutPage

PageId将保留内容列所属页面的Id。 例如,关于页面id = 1ServicesPage = 2。每个ContentColumn记录都将包含其所属页面的ID

我认为这会有效,但我得到了FK合并冲突。

我真的很困惑,我已经多次完成数据库设计,从来没有使用过CMS。我认为这个概念令我感到困惑。

我偶然发现我应该有一张Pages表

Pages
  --PageId
  --PageName ( Don't really need this column ? )

Pages表应该是一对一ServicesPage和一对一AboutPage,所有其他页面也应该在这里。

现在和我提出的问题有什么不一样?我想知道我在想什么,做错了。

表的外键是否可以链接到多个表(就像我在ContentColumn表中的PageId一样)? 对我来说,我有多大意义,因为您可以在Page Id表中将ContentCol链接到每个页面。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我想在您的数据库设计中提供一些观点。

首先:外键约束始终引用一个目标表。

所以你不能在一列中合并两个F.K. (除了你不想使用DBMS约束并在代码中处理这个约束,我不建议这样做)

其次:您的第二个设计(Page表)优于第一个设计。您可以使用Page表并将其使用F.K进入ContentColumns来处理第一个设计弱点。然后,您应该使用Page P.K作为F.K进入ServicePageAboutPage


第三:我建议您可以在一个表中合并AboutPageServicePage,并使用另一个表来保存其类型。

您的ServicePageAboutPage在列中看起来非常相似。我建议您使用这些表格而不是AboutPageServicePagePage表:

  • 一个PageType表:此表将页面类型作为记录保存(AboutPage,ServicePage和其他页面类型,将来可能会有)
  • Page表格会保存您的所有网页。您在PageTypePage之间存在一对多的关系。您应该在PageType中使用Page P.K作为F.K。

然后您可以在Page中使用ContentColumns P.K作为F.K。

使用此设计,您可以在运行时定义任何页面类型并动态控制它们。