Sql server 将数据库表与数据中的一些棘手内容组合在一起的好方法

Sql server 将数据库表与数据中的一些棘手内容组合在一起的好方法,sql-server,database-design,database-schema,Sql Server,Database Design,Database Schema,我有需要转换成表格的数据。这些数据主要涉及荷兰王国以及其他几个国家。这有几个陷阱: 荷兰王国由四个国家(如果其中一个是荷兰)和三个特别市镇组成,它们属于荷兰,但不属于荷兰本身 荷兰有省,这些省有市,市有住宅 这三个特别市不属于任何省,它们直接属于荷兰 从我们得到的数据来看,荷兰王国内的三个国家正是如此;数据显示了“国家”和“居住”下的国家 还有其他国家的荷兰人的问题。对于这些国家,我们不关心他们是否有省/市/等。我们只是从国家的角度来看这一点 为了更好地理解,我们得到的数据如下所示: 博内尔实

我有需要转换成表格的数据。这些数据主要涉及荷兰王国以及其他几个国家。这有几个陷阱:

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

荷兰有省,这些省有市,市有住宅

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

从我们得到的数据来看,荷兰王国内的三个国家正是如此;数据显示了“国家”和“居住”下的国家

还有其他国家的荷兰人的问题。对于这些国家,我们不关心他们是否有省/市/等。我们只是从国家的角度来看这一点

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

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

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

  • “省”表将具有CountryId
  • 市政当局表将具有ProvincesId
  • 住宅表将包含市政ID和国家ID
住宅表也会有一个CountryId的原因是因为像墨西哥这样的国家,我们不想知道/显示这些城市,但我们知道并想显示住宅

但是,这种方法的一个问题是,在墨西哥等国家,居住表中的市政当局列必须包含空值


还有一个问题是,在荷兰王国的一个国家(荷兰除外)的情况下,该国以及居住地都填写有该国的名称。我不知道将国家名称放在居住表中是否合理。

符合这些要求的DB设计解决方案可以是: 1) 地理对象类型(可能是层次结构)的字典表(id、名称),包含以下记录:

{id=1,Name=Province},
{id=2,Name=unicity},
{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}


这对于编辑层次结构来说是很灵活的,但是您需要额外的努力来选择记录(这是标准化的代价)。您还可以在新国家/地区需要时轻松添加额外的地理类型记录,而无需更改模式。

我假设,当我有一个特殊情况,如一个特殊城市,我想将其置于不同的地理类型下时,我会在表2中有多个条目)?不,为什么?对于博内尔来说,记录将是
{id=n,GeoTypeId=2,ParentId=null,CountryId=…,Name=Bonaire}
,因为传递数据的人可能希望看到博内尔,不仅是在市政级别(现在是),而且是在另一个地理类型。就像我在问题中的excel表格样本一样。我知道,不应该这样,但我不能排除他们会想要那样的。当然,当我必须展示荷兰王国的所有东西的摘要时,我会怎么做(或者更确切地说,我将如何查询)?@user3488442,我明白了。这个问题是数据输入的问题,而不是存储的问题。初始数据必须包含对象所属层次结构的信息,否则,如果没有视觉验证,您甚至不能说墨西哥是一个国家,而不是“荷兰市的特例”。因此,您可能必须实施一些数据验证。我不能提供精确的算法,甚至不能推荐,因为这一切都取决于具体的业务需求。如果您在excel工作表中获得初始数据,那么将很困难。我在这里谈到了这一点,您的回答非常有用。谢谢