规范化自引用属性

时间:2013-04-26 03:09:02

标签: sql database-design relational-database normalization

在包含spouse信息的数据库中规范化persons信息的最佳方法是什么?

数据包括:

person_id
first name
middle name
last name
phone number
address
vehicle
house
health
destiny
items
spouse first name
spouse middle name
spouse last name
spouse phone number
spouse address

我在考虑保留一个表格来考虑所有persons(配偶或其他),并区分spouse,如果其行具有另一个person_id的{​​{1}} person 1}}。这种自我参考是否可取?

我还要创建用于重复数据的表。例如healthvehicle

3 个答案:

答案 0 :(得分:3)

规范配偶信息包括删除spouse *列。如果您需要自引用表,则应该有spouse_id列引用person_id;但不要重复所有配偶信息,如姓名,地址和电话号码。

对于像人对车的一对多关系,是的,您需要“很多”端的表格(例如vehicle),其中person_id FK列。

另外,强烈考虑将address分解为自己的表。如果您计划在这一列中存储地址的所有元素,那么这非常非规范化(< 3NF):它们应分为不同的列(例如street,{{1 },municipality etcetera);而这些真的要求在一个独特的表格中。

自引用表是否可取?这取决于具体情况;但是根据我的经验,他们在数据中自然出现的地方是有道理的:我认为你所概述的通用“人”场景是合格的。相比之下,考虑一个相当人为的“图片”场景 - 表region包含picture列,以涵盖图片的图片......图片....(嗯,现在听起来不是这样的设法给了我......;但希望你能得到这个想法。)

答案 1 :(得分:3)

配偶也是“人”,因此配偶的详细信息必须作为单独的记录捕获。唯一可行的方法是引入spouse_id作为自引用键。您显示的上表未正常化,因为某人的表包含其他人的详细信息。我建议你按照以下方式修改'人员'架构

 person_id
 first_name
 middle_name
 last_name
 phone_number
 address
 vehicle
 house
 health
 destiny
 items
 spouse_id

答案 2 :(得分:0)

PARTY
id
name

PARTY_RELATIONSHIP
from_party_id not null references party(id)
to_party_id not null references party(id)
from_date not null
to_date null
primary key (from_party_id, to_party_id, from_date)
check (from_party_id <> to_party_id)
相关问题