【问题标题】:Database normalization for german cities, regions, districts etc德国城市、地区、地区等的数据库规范化
【发布时间】:2018-05-24 15:12:36
【问题描述】:
+-------------+----------------------------+-------------------+-----------+-----------+-------------------+
| postal_code | city_district              | city              | district  | region    | state             |
+-------------+----------------------------+-------------------+-----------+-----------+-------------------+
| 60313       | Innenstadt                 | Frankfurt am Main | NULL      | Darmstadt | Hessen            |
| 10719       | Charlottenburg-Wilmersdorf | Berlin            | NULL      | NULL      | Berlin            |
| 73773       | NULL                       | Aichwald          | Esslingen | Stuttgart | Baden-Württemberg |
+-------------+----------------------------+-------------------+-----------+-----------+-------------------+

有时 city_district、district 和 region 可以为 NULL。小城市没有市区。一个城市(法兰克福)可以包括/是一个地区。一个城市(柏林)可以包括/是一个区和一个地区。

表格是空的,将根据经过验证的用户输入进行填充。我为每列创建了自己的表并将它们连接起来,如下所示:

邮政编码:city_id
city_district: city_id
城市:区号
地区:region_id
地区:state_id
状态:名称

SELECT 
    *
FROM
postalcode
    LEFT JOIN
city ON postalcode.city_id = city.id
    LEFT JOIN
district ON city.district_id = district.id
    LEFT JOIN
region ON district.region_id = region.id
    LEFT JOIN
state ON region.state_id = state.id;

这样好吗?过度标准化?如何加入具有 NULL 值的表?我想通过 Joins 获得上表。如果我想在“postalcode”之后加入“citydistrict”,我会收到一条错误消息“Not unique table/alias”。我怎样才能正确地给表起别名?

邮政编码:https://en.wikipedia.org/wiki/Postal_codes_in_Germany
市区:https://en.wikipedia.org/wiki/Stadtbezirk
区: https://en.wikipedia.org/wiki/Districts_of_Germany
地区:https://en.wikipedia.org/wiki/Regierungsbezirk
状态:https://en.wikipedia.org/wiki/States_of_Germany

【问题讨论】:

  • 嗨。 “规范化”一词用于表示两个不同的东西:放入本身没有固定含义的 1NF,以及根据 FD 和 JD 分解为更高的 NF。两者都不涉及用 id 替换值。那你为什么用这个词?你在关注什么参考,你认为这个词是什么意思以及你认为你想要完成什么?此外,关系模型中没有空值,所以必须告诉我们你的参考资料说“规范化”是什么用空值。您的分解/重组在直觉上是合理的,但为什么您究竟要这样做?
  • PS 那么任何谷歌搜索告诉你关于使用 SQL 表别名的什么?
  • 我想避免重复。
  • 关于您的错误信息和评论:请在每个帖子中提出一个问题。请将说明编辑到帖子中,而不是 cmets。请阅读minimal reproducible example 并采取行动。了解 SQL select distincthow SQL cross/inner join worksnatural join

标签: mysql database-design database-normalization


【解决方案1】:

德国有大约 8K 个邮政编码?使用 no 规范化,该表可能大约为 1-2MB - 一个相当小的数量。根据您想要的索引,它可能会达到 3MB。

在每个级别进行归一化都是过度归一化。

每个邮政编码都在city 中吗?如果是这样,那么折衷方案是有两个表:

postal_code, city_district, city_id
city_id, city, district, region, state

这样做可能会将磁盘占用空间减半。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2012-03-29
    • 2011-07-31
    • 2023-03-22
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多