【问题标题】:A good way to put together database tables with a few tricky things in the data将数据库表与数据中一些棘手的东西放在一起的好方法
【发布时间】:2014-04-16 09:30:50
【问题描述】:

我有需要转换成表格的数据。该数据包含主要与荷兰王国有关的数据,以及一些其他国家/地区。这有一些陷阱:

荷兰王国由四个国家(如果是荷兰则一个)和三个特别自治市组成,它们属于荷兰,但不属于荷兰本身。

荷兰有省,省有市,市有住宅。

三个特别市不属于任何省,直接属于荷兰。

在我们得到的数据中,荷兰王国内部的三个国家就是这样;数据显示“国家”和“居住地”下的国家

还有其他国家的荷兰人的问题。对于那些国家,我们不在乎他们是否有省/直辖市/等。我们只是从国家的角度来看。

为了更好地理解,我们得到的数据如下所示:

博内尔实际上应该是国家:荷兰,自治市:博内尔(也许居住地:博内尔,不确定是否有助于查询)

我最初的想法是如何将其放入表格中:

  • Provinces 表将具有 CountryId
  • Municipalities 表将有一个 ProvincesId
  • Residences 表将包含一个 MunicipalitiesId 和一个 CountryId

Residences 表也有 CountryId 的原因是因为像墨西哥这样的国家/地区,我们不想知道/显示市政当局,但我们确实知道并想显示住所。

不过,这种方法的一个问题是,对于像墨西哥这样的国家/地区,Residences 表中的 Municipalities 列必须包含空值。

还有一个问题是,对于荷兰王国的国家(荷兰除外),Country 和 Residence 都填写了国家名称。我不知道将国家名称放在 Residences 表中是否明智。

【问题讨论】:

    标签: sql-server database-design database-schema


    【解决方案1】:

    具有这些要求的数据库设计解决方案可能是: 1) 带有记录的地理对象类型(可能是分层的)的字典表(id、名称):

    {id = 1, Name = Province}, {id = 2, Name = Municipality}, {id = 3, Name = City}

    2) 一个表(id、GeoTypeId、ParentId、CountryId、Name),其自身具有 FK(ParentId -> Id),用于存储对象的链接层次结构。记录将是:

    {id = 1, GeoTypeId = 1, ParentId = null, CountryId = ..., Name = Zuid-Holland}, {id = 2, GeoTypeId = 2, ParentId = 1, CountryId = ..., Name = Rotterdam} 。 对于墨西哥,记录为 {id = n, GeoTypeId = 3, ParentId = null, CountryId = ..., Name = Morelia}

    这对于编辑层次结构会很灵活,但您需要一些额外的努力来选择记录(这是规范化的代价)。您还可以在新国家/地区需要时轻松添加其他 GeoType 记录,而无需更改架构。

    【讨论】:

    • 我假设当我有一个特殊情况,比如我想将一个特殊的自治市放在不同的地理类型下时,我会在表 2 中有多个条目)?
    • 不,为什么?对于 Bonaire,记录将是 {id = n, GeoTypeId = 2, ParentId = null, CountryId = ..., Name = Bonaire}
    • 因为可能会发生这样的情况,即提供数据的人不仅希望看到博内尔岛的市级(事实上),还希望看到另一个 GeoType。就像我在我的问题中提出的样本 Excel 表一样。我知道,不应该,但我不能排除他们可能想要这样。当然,当我必须展示荷兰王国所有事物的摘要时,我会怎么做(或者更确切地说,我将如何查询)?
    • @user3488442,我明白了。这个问题是数据录入问题,不是存储问题。初始数据必须包含对象属于哪个层次结构的信息,否则如果没有视觉验证,您甚至无法说墨西哥是一个国家,而不是“荷兰自治市的特例”。因此,您可能必须实施一些数据验证。我无法提供确切的算法甚至推荐,因为这完全取决于特定的业务需求。如果你在excel表格中获得初始数据,那就很难了
    • 我在这里谈到了它,你的回答是最有帮助的。谢谢!
    猜你喜欢
    • 2012-03-06
    • 2015-02-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多