Sql server 数据库设计查询-如何连接这些表?

Sql server 数据库设计查询-如何连接这些表?,sql-server,database-design,Sql Server,Database Design,我在CMS数据库(SQL Server 2008)中为一个网站提供了以下表格: SiteMap Page Link ========= ========= ========= SiteMapId PageId LinkId LeftNode Name Name RightNode UrlId Url -- etc -- -- etc -- 站

我在CMS数据库(SQL Server 2008)中为一个网站提供了以下表格:

SiteMap Page Link ========= ========= ========= SiteMapId PageId LinkId LeftNode Name Name RightNode UrlId Url -- etc -- -- etc -- 站点地图页面链接 ========= ========= ========= SiteMapId页面ID链接 左节点名称 RightNode Url ID Url --等等----
  • Sitemap表包含使用的网站层次结构,主要用于生成网站导航
  • 页面表包含CMS系统提供的页面数据
  • 链接表包含站点导航上显示的URL,但CMS不提供这些URL(例如指向其他站点的外部链接)
每个站点地图行都需要链接到页面或链接表中的一行,这就是问题所在。最好的办法是什么

  • 将SiteMapId外键同时添加到页面和链接表中-缺点:允许同一个SiteMap行被多个记录(在两个表中)引用
  • 将PageId和LinkId列添加到站点地图表-缺点:一列将是多余的,因为它将始终包含null或0
  • 将PageOrLinkId列添加到站点地图表中,并将位字段列标记为包含PageId或LinkId-缺点:无法向关系添加约束以确保它们包含有效值

  • 有人能建议我应该使用上面哪一个,或者想出一个更好的选择吗?谢谢。

    您可以将这些表支持的多对多关系作为另一个选项:

    站点地图页面
    SiteMapId
    页面ID

    站点地图链接
    SiteMapId
    链接ID


    编辑:但经过思考,它不可能比您的选项1更有用……对不起

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


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

    另一个可能性:添加一个带有SiteMapId、PageId和LinkId的新表,并添加约束 (((PageId为NULL或LinkId为NULL)和(PageId为非NULL或LinkId为非NULL))以及SiteMapId为非NULL))

    然后你就可以使用新的桌子加入到另外两张桌子上了……就在我30秒的即兴思考中。
    (*未测试)

    如果有一个名为SiteItem的表,其中包含SiteMapID,并且与页面和链接表都有1-1关系,即SiteItem表中的一个条目在页面或链接表中都有一个条目,该怎么办。在这种情况下,页面和链接表类似于SiteItem表的子类。

    我个人认为,选项2是确保执行一条且只有一条记录的最简单方法。应该设置触发器以确保两个值中至少有一个为空。在这种情况下,使用空值本身并没有什么不好的

    通过直接向主键添加约束,最终解决了这个问题,因此SiteMapId是一个自动编号/标识,与PageId和LinkId具有一对一的关系。它不会停止为一个站点地图行添加页面和链接行,但会避免任何冗余列或附加表。

    您的业务规则是什么?一个站点地图记录是否可以同时映射到一个页面和链接记录,以及可能的多个页面/链接记录?@OMG Ponies-1到1-站点地图记录只能链接到一个页面记录或一个链接记录关于重复的内容-可以有多个
    页面
    (或
    链接
    )是否与相同的
    站点地图ID
    相关?没有重复项-页面/链接应仅与一个站点地图行相关