【问题标题】:What is the best way to design the schema for the following?为以下内容设计架构的最佳方法是什么?
【发布时间】:2009-09-29 06:28:08
【问题描述】:

为以下内容设计架构的最佳方法是什么 要求?

需要存储Countries,States,Counties,可以分县 进入区域。然后,区域可以拥有具有各种数据点的人 报告。

区域还可以进一步划分为部门,即 比如把人分组。所以 Region 1 可以有 Division A、Division B 与每个部门的人员。地区和部门,每个都有 不同于国家、州和县的不同元数据集。

报告将包含与人和类似的相关数据 通过从 Country 向下钻取来进行谷歌分析 一直到地区和部门。

注意:区域可以有 10 个人和 1 个师,4 人,其余 6 人 与任何部门无关。

【问题讨论】:

  • 如果您发布关于最佳方式的想法并要求验证/改进,而不是要求社区为您设计架构,您可能会得到更好的回应。
  • 地区和部门会随着时间而改变吗?您是否必须考虑国家/地区/等之类的事情?分开还是重新合并?人们与不同部门的隶属关系会随着时间而改变吗?如果是这样,你在乎吗?如果其中任何一项适用,您可能需要阅读 Martin Fowler 的问责制“分析”模式。

标签: sql database-design data-modeling


【解决方案1】:

听起来每个人只能有一个区域。

如果您正在进行事务处理(而不是数据挖掘/仓储),那么我会使用 RegionID 外键将该人链接到该区域。

至于(可选)部门,您可以使用链接表将人员链接到部门:PersonIDDivisionID,或者如果您不介意NULLDivisionID,您可以外键。

就地理区域的层次结构而言,在我进一步了解不同国家/地区的限制以及这些结构所代表的含义之前,我会犹豫是否要对其进行建模。虽然很高兴认为所有内容总是会升级到下一个级别,但我已经处理了很多级别被跳过的层次结构,并且这些层次结构的建模方式非常不同。另外,像英国这样的许多国家通常不会有州(除非您要使用英格兰、苏格兰、威尔士和北爱尔兰)。 France is even more complex.

对于报告/汇总方面(或者如果您只进行数据挖掘/仓储),我将转换为单独的维度模型,该模型会将其他事物“锁定”为属性并使其更容易执行卷起。因此星型模式将锁定不同级别的维度 ID。

【讨论】:

    【解决方案2】:

    在我的头顶:

    • countries,States,counties,cities 都有 fk to region。
    • states 对国家有 fk
    • 县与州有联系
    • 城市与县之间有联系
    • regions 有 fk 到部门
    • 人们有 fk 到 Divisions_people
    • divisions_people 对人员和部门有 fk
    • divisions 有 fk 到 divisions_people

      country <- state <- county <- city
        ^          ^         ^      ^
         \          \        /     /
                     regions
                        ^
                        |
                    divisions
                        ^
                        |   
                       \|/
                  divisions_people (1 person in multiple divisions)
                        ^
                        |
                      people
      

    【讨论】:

      【解决方案3】:

      国家/地区表: country_id, country_name, 人口

      状态表: state_id, state_name, country_id, 人口

      县表: County_id、county_name、state_id、人口

      地区表: region_id、region_name、county_id、人口

      分区表: Division_id, Division_name, region_id, 人口

      在您的代码中或通过触发约束(取决于您的 RDBMS)验证您在只有 50 人的区域内没有 300 人的部门。如果要在一个区域中拥有不属于分区的人员,则您的区域人口将为 500,而其分区的总和仅为 450(一个区域中有 50 人但没有分区)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-30
        • 2011-04-04
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-12
        • 2020-03-21
        • 1970-01-01
        相关资源
        最近更新 更多