将数据库表与数据中的一些棘手的东西放在一起的好方法

时间:2014-04-16 09:30:51

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

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

荷兰王国由四个国家(一个是荷兰)和三个特殊城市组成,属于荷兰,但不属于荷兰本身。

荷兰有省份,省份有市镇,市镇有住所。

三个特殊城市不属于任何省份,它们直接属于荷兰。

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

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

为了更好地了解,我们得到的数据看起来像这样:

SampleData

Bonaire实际上应该是国家:荷兰,市政府:Bonaire(也许住所:Bonaire,不确定它是否有助于查询)

我最初想过如何把它放在表格中如下:

TableStructure

  • 省份表将有CountryId
  • 市政府表将有一个ProvincesId
  • 住宅表将有一个MunicipalitiesId和一个CountryId

Residences表还有一个CountryId的原因是因为像墨西哥这样的国家,我们不想知道/显示市政当局,但我们知道并希望展示住所。

这种方法存在的一个问题是,如墨西哥这样的国家,Residences表中的Municipalities列必须包含空值。

另一个问题是,对于荷兰王国的一个国家(荷兰除外),国家和居住地都填写了该国的名称。我不知道把这个国家的名字放在住宅表中是否明智。

1 个答案:

答案 0 :(得分:0)

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

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

2)具有FK到自身的表(id,GeoTypeId,ParentId,CountryId,Name)(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记录,而无需更改架构。