如何为这些需求设计SQL表

如何为这些需求设计SQL表,sql,database-design,Sql,Database Design,我的数据为城市和地区 每个城市都有多个区域 每个区域都有多个区域(这里没有尽头,用户可以在子区域下动态添加区域,如区域->区域->区域….->AREA) 那么,如何设计这样的表结构来满足这些要求呢 提前感谢。城市表 城市ID(PK) 城市名称 城市区域表 CityID(复合(双柱)PKey) AreaID(如果您希望某个区域只能由一个城市拥有,请在此列中添加唯一索引) 面积表 区域ID(主键) 域名 面积映射表 区域ID(所有者区域)(组合(两列)PKey) 面积 规则 为了将

我的数据为
城市
地区

  • 每个
    城市
    都有多个
    区域
  • 每个
    区域
    都有多个
    区域
    (这里没有尽头,用户可以在子
    区域
    下动态添加
    区域
    ,如
    区域->区域->区域….->AREA
  • 那么,如何设计这样的表结构来满足这些要求呢


    提前感谢。

    城市表

    • 城市ID(PK)
    • 城市名称
    城市区域表

    • CityID(复合(双柱)PKey)
    • AreaID(如果您希望某个区域只能由一个城市拥有,请在此列中添加唯一索引)
    面积表

    • 区域ID(主键)
    • 域名
    面积映射表

    • 区域ID(所有者区域)(组合(两列)PKey)
    • 面积
    规则

    • 为了将一个区域映射到另一个区域,区域表中必须有每个区域的记录
    • 在面积映射表中,必须确定这些关系是双向的还是单向的。在我看来,这将是一种方式。第一个AreaID是拥有第二个AreaID的区域

    表格区域

    • id(主键)
    • 如果没有父区域(区域表上的FK),则父区域\u区域\u id-它所属的区域-可以为空
    • 城市标识-它所属的城市-如果父区域标识已完成,则可以从业务逻辑强制城市标识为空,反之亦然(城市表上的FK)
    • 其他有用的专栏
    城市

    • id(主键)
    • 其他有用信息

    您可能有兴趣阅读-它也适用于其他数据库引擎,它可能是一个树(或者可能是一个层次结构)。最常见的解决方案(您将在这里的其他答案中看到)是使用邻接列表模型。然而,另一个“大”的想法是嵌套集合模型。关于这个主题的一本有用的书是。

    自反关系

    或者,如果您喜欢


    对于SQL Server 2008,可以选择层次结构数据类型


    这里是一个关于

    的链接,在您的示例中,一个区域可以属于多个城市,也可以属于多个区域。在他的描述中,似乎只有一个城市可以有许多区域,一个区域可以有许多子区域。这些是一对多关系,而不是多对多关系,固定了Cita区域表上的唯一索引。然而,我不认为我们可以排除一个区域可能被多个区域拥有的可能性。示例:公园归街区所有,街区归社区所有。虽然最好是拥有一个所有权链,但这里的问题有点模糊。请注意,从技术上讲,如果一个区域只能由一个城市拥有,那么城市区域可以在AreaID上单独拥有一个PKey。然而,为了让其他程序员理解,我可能会保留两列PKEY和unique约束。添加unique复合PK并不能解决多对多问题。示例AreaId 20、CityId 30和CityId为40的AreaId 20-这两个都是成对的Unique,而Area 20属于两个不好的城市(30和40)-Area Area table的情况也是如此。您的设计允许一个区域具有多个父区域-我的设计不允许Pivot表(包含复合主键的表)用于m到n关系-当有人使用它们来建模1到n关系时,这会让人感到困惑每个区域是否具有多个子区域、多个父区域,或者两者都有?+1表示嵌套集(链接中)。我还没有试过,但在某些情况下,它们可能会更快。这是乔·塞尔科的文章