Postgres中的地址模式

问题描述 投票:0回答:2

我有 satffsusers 数据库中的表。

// staffs

id Int
role_id Int
name String
// users

id Int
name String

我需要为两个表添加地址。(因为我想以后允许用户有多个地址,但可能不适合员工。)

哪种方案比较好?

方案一: 为每个人建立专门的地址数据库 usersstaffs.

// 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, staffsaddresses 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
database postgresql
2个回答
2
投票

从规范化的角度来看,当然,你可以把地址拉出到他们自己的表中,但我认为在你设计的这一点上,这将是一个错误。这真的不是一个技术决定。

一个人和许多地点之间的关系列表,如果没有某种识别特征(如home_address,work_address,past_address),会很快演变成一个毫无意义的列表,其中包括一个人曾经去过的所有地方。事实上,几乎没有什么可以区分你的 addresses 表从... ... 只是一个地球地图。

因此,我怀疑 选择1 实际上是您目前最好的选择,而且随着时间的推移,您可以很容易地扩展功能。


2
投票

在我看来 选择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 代表 Users 代表 Staff. 每当你将地址与用户或员工表连接时,你必须将条件放在 address_type.

select t1.*,t2.* from users t1 inner join addresses t2 on t1.id=t2.id and t2.address_type ='u'
© www.soinside.com 2019 - 2024. All rights reserved.