如果城市和地区之间存在关系,那么地区 - >城市是一对多的映射。
以下是数据库设计:
城市
区域
region_id
是Region
表
我想知道 region_id和city_id 是否是候选键。由于city_name对候选键的部分依赖性,该关系不在2 NF中。
如何处理一对多映射的规范化?
答案 0 :(得分:0)
city_id
和region_id
字段的组合可以是city
中的候选键,具体取决于您如何定义2个字段(您的帖子没有说明任何内容),因为
候选键可以是任何列或列的组合,可以作为数据库中的唯一键。一个表中可以有多个候选键。每个候选人密钥都可以作为主要密钥。
来源:Difference Between Candidate Keys and Primary Key In Simple Words
您可以单独定义city_id
是唯一的(可能是auto_increment),但您也可以只定义2个唯一字段的组合。
但是,我不会这样做,因为如果你重新分类一个城市(从一个地区移动到另一个地区),那么你可能还需要更改city_id组件。
答案 1 :(得分:0)
由于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
换句话说,你只想要一个名为'Paris'的城市,因为所有的Parises都是同一个实体?我认为这是一个奇怪的世界观!
我认为大多数人会认为每个巴黎都是独立的实体,因此会有不同的标识来区分它们:
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' };
即使按照上面的表格,我也不太清楚纽约市的关键。我认为关系变量“做得太多了”;理想情况下,我们会有第二个relvar来模拟城市与其所在地区之间的关系:
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)。