具有一对多关系的表的规范化

时间:2016-10-27 09:35:39

标签: mysql sql

如果城市和地区之间存在关系,那么地区 - >城市是一对多的映射。

以下是数据库设计:

城市

  1. city_id
  2. CITY_NAME
  3. 的region_id
  4. 区域

    1. ID
    2. 名称
    3. region_idRegion

      的外键

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

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

2 个答案:

答案 0 :(得分:0)

city_idregion_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)。