如果城市与区域之间存在关系,那么region-> city是一对多映射。

以下是数据库设计:




city_id
城市名称
region_id


区域


ID
名称


region_idRegion表的外键

我想知道region_id和city_id是否为候选键。由于city_name对候选键的部分依赖,该关系不在2 NF中。

如何处理一对多映射的规范化?

最佳答案

由于city_name对候选键的部分依赖,所以该关系不在2 NF中


那么您的数据看起来像这样吗?:

Region ( key = region_id ):
{ region_id = 'R01', region_name = 'France' };
{ region_id = 'R02', region_name = 'Texas' };

City ( key = ??? ):
{ city_id = 'C01', city_name = 'Paris', region_id = 'R01' };  -- Paris, France
{ city_id = 'C01', city_name = 'Paris', region_id = 'R02' };  -- Paris, Texas


换句话说,您只想要一个名为“巴黎”的城市,因为所有巴黎都是同一个实体?我建议这是一个奇怪的世界观!

我认为大多数人会认为每个巴黎都是独立的实体,因此会有不同的标识符来区分它们:

Region ( key = region_id ):
{ region_id = 'R01', region_name = 'France' };
{ region_id = 'R02', region_name = 'Texas' };

City ( key = ??? ):
{ city_id = 'C01', city_name = 'Paris', region_id = 'R01' };
{ city_id = 'C02', city_name = 'Paris', region_id = 'R02' };


即使有上表,我对城市的钥匙也还是不太清楚。我认为关系变量“做得太多”;理想情况下,我们将使用第二个相对变量来模拟城市与其区域之间的关系:

Region ( key = region_id ):
{ region_id = 'R01', region_name = 'France' };
{ region_id = 'R02', region_name = 'Texas' };

City ( key = city_id ):
{ city_id = 'C01', city_name = 'Paris' };
{ city_id = 'C02', city_name = 'Paris' };

CityRegion ( key = city_id ):
{ city_id = 'C01', region_id = 'R01' };
{ city_id = 'C02', region_id = 'R02' };


上面的代码现已完全规范化(实际上是6NF)。

关于mysql - 具有一对多关系的表的规范化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40281102/

10-17 01:51