数据库设计查询 - 如何加入这些表?

时间:2010-02-10 21:28:32

标签: sql-server database-design

我在一个网站的CMS数据库(SQL Server 2008)中有以下表格:

SiteMap       Page          Link
=========     =========     =========
SiteMapId     PageId        LinkId
LeftNode      Name          Name
RightNode     UrlId         Url
              -- etc --     -- etc --
  • Sitemap表包含使用nested set model的网站层次结构,主要用于生成网站导航。
  • 页面表包含CMS系统所服务页面的数据。
  • 链接表包含在网站导航中显示但不由CMS提供的网址(例如,指向其他网站的外部链接)。

每个SiteMap行都需要链接到Page或Link表中的一行,这就存在问题。什么是最好的方式?

  1. 将PageMapId外键添加到Page和Link表中 - 缺点:允许同一个SiteMap行被多个记录引用(在两个表中)。
  2. 将PageId和LinkId列添加到SiteMap表中 - 缺点:一列将是多余的,因为它始终包含null或0。
  3. 将PageOrLinkId列添加到SiteMap表和位字段列以将其标记为包含PageId或LinkId - 缺点:无法向关系添加约束以确保它们包含有效值。
  4. 任何人都可以建议我应该使用哪种,或者提出更好的选择?感谢。

6 个答案:

答案 0 :(得分:1)

如果每个SiteMap只能连接一个页面或链接,那么我会选择第一个选项。在这种情况下,您不会像第二个选项那样具有空值,也不会像第三个选项那样具有不必要的列。

获取所有页面(或链接)非常简单,因为它只是一个简单的内部联接。

答案 1 :(得分:1)

就个人而言,事情选项2是最简单的方法,以确保您的一个且只有一个记录被强制执行。应该设置触发器以确保两个值中的至少一个为空。在这种情况下,使用空值没有任何内在的坏处。

答案 2 :(得分:0)

这些表可以支持多对多关系作为另一种选择:

<强> SiteMapPage
SiteMapId
的PageId

<强> SiteMapLink
SiteMapId
LINKID

编辑:但反思不可能比你的选择1更有用......抱歉!

答案 3 :(得分:0)

另一个可能性:使用SiteMapId,PageId和LinkId添加新表并添加约束 (((PageId IS为NULL或LinkId为空)AND(PageId不为NULL或LinkId为非NULL))和SiteMapId不为空))

然后你可以使用新表加入其他两个表...只是我的袖口想法的30秒。 (*未经测试)

答案 4 :(得分:0)

如果有一个名为SiteItem的表,其中包含SiteMapID,并且与Page表和Link表之间存在1-1关系,那么SiteItem表中的条目在页面或链接表中都有一个条目。在这种情况下,Page和Link表就像SiteItem表的子类。

答案 5 :(得分:0)

最后通过直接向主键添加约束来解决这个问题,因此SiteMapId是一个自动编号/身份,与PageId和LinkId具有一对一的关系。它不会停止为一个SiteMap行添加Page和Link行,但会避免使用任何冗余列或其他表。