将数据库转换为第三范式时与 city/country 混淆
Confusion with city/country when bringing database to third normal form
我正在尝试规范化一个 table 并将其转化为第三范式,但我对这种情况感到困惑:
就拿这个简单的 table:
stores
-------
id name type city country
country
是否通过 city
传递依赖于 id
?我急忙答应,但转念一想,另一个国家可能存在同名城市。这是否意味着这个 table 是第三范式,或者有什么需要修改的?
我会说城市和国家需要一个单独的 table。认为城市可以更改名称(印度仍在重命名城市:孟买到蒙买发生在几年前,但似乎仍在发生)。苏格兰最近也举行了一次脱欧公投;他们投票 'stay',但问题似乎远未结束。
所以我将 city/country 放在单独的 table 中。我什至可以将它们放在两个单独的 table 中,但除非你有一些依赖于国家/地区的功能(例如税收计算),否则我可能会坚持使用一个。
有趣的问题。你是对的,country
不依赖于 city
(例如 'Paris' 不足以确定国家 - 是法国还是美国德克萨斯州?)
city 列本身并不代表我们想要关联的域,但如果 city 和 country 的组合确实如此,那么我会认为 (city, country)
是一个复合值,类似于日期是 (day, month, year)
的组合。这意味着关系在 3NF 中有 3 个 FD:id->name
、id->type
和 id->(city,country)
,因为依赖性 (city,country)->country
被认为是微不足道的。实际上,我会考虑在这种情况下引入代理键。
如果城市和国家的组合不是唯一的,那么我们仍然有一个 3NF table,其中包含 FD id->name
、id->type
、id->city
和 id->country
并且最后两个之间没有依赖关系。
我正在尝试规范化一个 table 并将其转化为第三范式,但我对这种情况感到困惑:
就拿这个简单的 table:
stores
-------
id name type city country
country
是否通过 city
传递依赖于 id
?我急忙答应,但转念一想,另一个国家可能存在同名城市。这是否意味着这个 table 是第三范式,或者有什么需要修改的?
我会说城市和国家需要一个单独的 table。认为城市可以更改名称(印度仍在重命名城市:孟买到蒙买发生在几年前,但似乎仍在发生)。苏格兰最近也举行了一次脱欧公投;他们投票 'stay',但问题似乎远未结束。
所以我将 city/country 放在单独的 table 中。我什至可以将它们放在两个单独的 table 中,但除非你有一些依赖于国家/地区的功能(例如税收计算),否则我可能会坚持使用一个。
有趣的问题。你是对的,country
不依赖于 city
(例如 'Paris' 不足以确定国家 - 是法国还是美国德克萨斯州?)
city 列本身并不代表我们想要关联的域,但如果 city 和 country 的组合确实如此,那么我会认为 (city, country)
是一个复合值,类似于日期是 (day, month, year)
的组合。这意味着关系在 3NF 中有 3 个 FD:id->name
、id->type
和 id->(city,country)
,因为依赖性 (city,country)->country
被认为是微不足道的。实际上,我会考虑在这种情况下引入代理键。
如果城市和国家的组合不是唯一的,那么我们仍然有一个 3NF table,其中包含 FD id->name
、id->type
、id->city
和 id->country
并且最后两个之间没有依赖关系。