我正在设计标准的CMS数据库结构。 这些是我的实体表:
ServicesPage
--ServicesPageId
--HeaderTitle
--HeaderParagraph
AboutPage
--AboutPageId
--HeaderTitle
--HeaderParagraph
ContentColumns (A section that can belong to pages)
--Id
--Title
--Paragraph
--Image
--FK_PageId
......和其他页面
PageId
将保留内容列所属页面的Id
。
例如,关于页面id = 1
,ServicesPage = 2
。每个ContentColumn
记录都将包含其所属页面的ID
我认为这会有效,但我得到了FK合并冲突。
我真的很困惑,我已经多次完成数据库设计,从来没有使用过CMS。我认为这个概念令我感到困惑。
我偶然发现我应该有一张Pages表
Pages
--PageId
--PageName ( Don't really need this column ? )
Pages
表应该是一对一ServicesPage
和一对一AboutPage
,所有其他页面也应该在这里。
现在和我提出的问题有什么不一样?我想知道我在想什么,做错了。
表的外键是否可以链接到多个表(就像我在ContentColumn表中的PageId一样)?
对我来说,我有多大意义,因为您可以在Page Id表中将ContentCol
链接到每个页面。
非常感谢你的帮助。
答案 0 :(得分:0)
我想在您的数据库设计中提供一些观点。
首先:外键约束始终引用一个目标表。
所以你不能在一列中合并两个F.K. (除了你不想使用DBMS约束并在代码中处理这个约束,我不建议这样做)
其次:您的第二个设计(Page
表)优于第一个设计。您可以使用Page
表并将其使用F.K进入ContentColumns
来处理第一个设计弱点。然后,您应该使用Page
P.K作为F.K进入ServicePage
和AboutPage
。
第三:我建议您可以在一个表中合并AboutPage
和ServicePage
,并使用另一个表来保存其类型。
您的ServicePage
和AboutPage
在列中看起来非常相似。我建议您使用这些表格而不是AboutPage
,ServicePage
或Page
表:
PageType
表:此表将页面类型作为记录保存(AboutPage,ServicePage和其他页面类型,将来可能会有)Page
表格会保存您的所有网页。您在PageType
和Page
之间存在一对多的关系。您应该在PageType
中使用Page
P.K作为F.K。然后您可以在Page
中使用ContentColumns
P.K作为F.K。
使用此设计,您可以在运行时定义任何页面类型并动态控制它们。