在包含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}}。这种自我参考是否可取?
我还要创建用于重复数据的表。例如health
,vehicle
等
答案 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)