我有 satffs
和 users
数据库中的表。
// staffs
id Int
role_id Int
name String
// users
id Int
name String
我需要为两个表添加地址。(因为我想以后允许用户有多个地址,但可能不适合员工。)
哪种方案比较好?
方案一: 为每个人建立专门的地址数据库 users
和 staffs
.
// user_addresses
id Int
user_id <FK> Int
street String
city String
// staff_addresses
id Int
staff_id <FK> Int
street String
city String
备选方案2: 或创建 addresses
表,并再创建2张带有 users
, staffs
和 addresses
id引用。
// addresses
id Int
street String
city String
// user_addresses
id Int
user_id <FK> Int
address_id <FK> Int
// staff_addresses
id Int
staff_id <FK> Int
address_id <FK> Int
从规范化的角度来看,当然,你可以把地址拉出到他们自己的表中,但我认为在你设计的这一点上,这将是一个错误。这真的不是一个技术决定。
一个人和许多地点之间的关系列表,如果没有某种识别特征(如home_address,work_address,past_address),会很快演变成一个毫无意义的列表,其中包括一个人曾经去过的所有地方。事实上,几乎没有什么可以区分你的 addresses
表从... ... 只是一个地球地图。
因此,我怀疑 选择1 实际上是您目前最好的选择,而且随着时间的推移,您可以很容易地扩展功能。
在我看来 选择1 更好
但我更喜欢用另一种方式来存储地址,在这种情况下,使用单表而不使用 Foreign Key
create table addresses (
id int primary key,
address_type char(1) not null check(address_type in ('u', 's')),
linked_id int,
street varchar(100),
city varchar(100)
);
哪儿 u
代表 User
和 s
代表 Staff
. 每当你将地址与用户或员工表连接时,你必须将条件放在 address_type
.
select t1.*,t2.* from users t1 inner join addresses t2 on t1.id=t2.id and t2.address_type ='u'