如果城市与区域之间存在关系,那么region-> city是一对多映射。
以下是数据库设计:
市
city_id
城市名称
region_id
区域
ID
名称region_id
是Region
表的外键
我想知道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/