让我们考虑一下为客户建模的以下关系
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_city可能与每个客户的living_city不同的语义。
考虑到城市和位置的两种关系是不公平的,因为它们的价值可能会重叠,如果我们决定改变一些城市的 birth_city 值的位置,这个城市就存在于< strong> 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]
如何建立关系模型?
答案 0 :(得分:1)
虽然您的模型确实遵循完全规范化原则,但它不遵循正交设计原则,即您有两个具有重叠含义的关系。
如果你遵循这个原则,关系将是:
客户(customer_num,birth_city,living_city)
城市(city,city_location)
这样:
ρ city / birth_city (Π birth_city (Customers))⊆Π city (Cities)
ρ city / living_city (Π living_city (Customers))⊆Π city (Cities)
,其中
Π:投影
ρ:重命名
我会注意到关于正交设计的精确定义没有达成一致。