关系模型:多个重叠的功能依赖关系



让我们考虑以下关系,该关系为某处的客户建模

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&戳城市(城市)

其中

&戳;:投影
ρ:重命名

我想指出的是,对于正交设计的精确定义,目前还没有达成一致。

最新更新