规范化:部分依赖和传递依赖属性冲突



当我在练习规范化时,我遇到了这个问题:

规范化以下

AB (,b, c, d, e, f, g)
b——比;C, e
C—>E, g
a—>d

,其中a, b为组合主键。

我看到这已经在1NF;当我试着将它归一化为2NF时,我发现e部分依赖于b;同时它又依赖于c,所以我很困惑;如何继续?

这个碰撞案例的真实例子是什么?

我不愿意解释正常的形式,但在现实世界中,它通常是这样工作的(对于本例,目的是联系人管理)

  1. 每个表都有一个主键字段。我叫它pk(主键)重要:尽量避免使用多个列来创建pk。为什么?因为如果列数据改变(它会改变),你的pk必须被解构——这不是一个好主意,因为这会颠覆你的数据库!pk是每行数据的id(对于所有意图和目的)。

重要:大多数数据库允许您为字段指定增量值。您可以对pk字段/列执行此操作,这意味着每当添加新记录(或行)时,它将向最后一个pk值添加1。大多数数据库还允许您将一个字段设置为主键(因此我将该字段的名称称为"pk"),这意味着数据库不允许在该列中有任何重复的值,这是非常重要的。

  1. 每一列都是原子的,这意味着它不能进一步分解,例如,地址可以分解为:街道,城市,州和zip,所以您不会创建这样的表:

    的人pk | name | address

您可以这样创建一个表:(但请继续阅读)

People
--------------------
pk | first name | last name | street | city | state | zip

注意:假设您正在按姓名搜索一个人。一旦有了那个人,pk (id字段)就允许您识别该行上的任何其他数据以及任何相关数据(请继续阅读)。这就是pk存在的主要原因。

  1. 问自己是否有多于一个的每一个?

问:这个人有多个名字吗?从法律上讲,答案是否定的,但他们可能有一个昵称!会有不止一个昵称吗?可能不会或极不可能。您想要存储昵称吗?如果是,则在表中添加昵称。

People
--------------------
pk | first name | nick name | last name | street | city | state | zip

问:这个人可以有多个地址吗?是的!家庭住址、工作地址、邮寄地址、邮箱等。因此,这就是RDMS(关系数据库管理系统)中的关系发挥作用的地方。您需要两张表:一张用于人,另一张用于地址。

表1:

People
--------------------
pk | first name | nick name | last name 
10 | William    | Bill      | Smith

表2:

Addresses
--------------------
pk | fk | street               | city  | state | zip   | identifier
1  | 10 | 3110 Franklin Street | Ogden | UT    | 84041 | Home
2  | 10 | 2100 Washington blvd | Ogden | UT    | 84104 | Work

我称之为父子关系(在SQL中这是一对多关系)。在本例中,子节点是父节点的地址。一个人到多个地址。

注意:每行有一个唯一的pk(主键),每个pk代表

fk = foreign key外键与表中的主键相同人表1。这就是地址如何链接到1.

假设你知道每个人都需要一个电话号码。问:每个人可以有一个以上的电话号码吗?是的!这就要求另一个表。

现在你的数据库是这样的:

表1:

People
--------------------
pk | first name | nick name | last name 
10 | William    | Bill      | Smith

表2:

Addresses
-------------------
pk | fk | street          | city  | state | zip   | identifier
1  | 10 | 3110 Franklin   | Ogden | UT    | 84041 | Home
2  | 10 | 2100 Washington | Ogden | UT    | 84104 | Work

表3:

Phones
-------------------------
pk | fk | phone_number | identifier
1  | 10 | 801-555-1212 | Home
2  | 10 | 801-555-1213 | Work

这是数据库专业人员在现实世界中的做法,但我看到一些大公司多次违反这些规则。

我见过数百个数据库,几乎没有遵循正常形式或现实。所以,我会说,"是的!"一定要理解DB标准格式,但要在现实世界中根据实际情况使用它们。它被称为关系数据库是有原因的。">

除此之外,有时你需要一个多对多的关系,如果有人要求的话,我很乐意画出来。

最新更新