让我们考虑以下关系,该关系为某处的客户建模
R1 = (customer_num, birth_city, living_city, birth_city_location, living_city_location)
其中birth_city是客户出生的城市,而living_city客户居住的城市。此外,我们认为一个城市值决定一个位置值。
让我们考虑一下我们有下面的功能依赖性列表:
customer_num --> birth_city
customer_num --> living_city
birth_city --> birth_city_location
living_city --> living_city_location
实现正常形式的最佳分解是:
(customer_num, birth_city, living_city)
(birth_city, birth_city_location)
(living_city, living_city_location)
这意味着为城市创造两种关系。
事实上,我认为一个关系就足够了,因为如果我们知道城市,我们就知道它的位置,这两个关系意味着数据冗余。但是,如果我们在基本关系中考虑birth_city=living_city,我们将失去这样的语义,即每个客户的birth_ccity可能不同于living_city。
考虑城市和位置的两种关系是不公平的,因为它们的值可能重叠,如果我们决定更改birth_city值中的某个城市的位置,并且该城市存在于living_city值中,那么我们将使DB处于不一致的状态。
我可以更笼统地重新表述这个问题:
R = (A, X1, X2, Y1, Y2)
其中
A --> X1
A --> X2
X1 --> Y1
X2 --> Y2
我们有一个特殊的情况,那就是:
if t1[X1] = t2[X2] then t1[Y1] = t2[Y2]
如何建立关系模型?
尽管您的模型确实遵循了完全归一化原则,但它没有遵循正交设计原则 如果你遵循这一原则,关系将是: 客户(customer_num、birth_city、living_city) 这样: ρ城市/出生城市(∏出生城市(客户))⊂戳城市(城市) 其中 &戳;:投影 我想指出的是,对于正交设计的精确定义,目前还没有达成一致。
城市(城市、城市位置)
ρ城市/living_city&戳城市(城市)
ρ:重命名