由于 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' };
即使有上面的表格,我也对城市的钥匙有点不清楚。我认为关系变量“做得太多”;理想情况下,我们应该有第二个 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 中)。