【发布时间】:2021-09-07 15:36:13
【问题描述】:
我需要创建一个 person 表,其列是 id、name、gender、job 和 children。然后,children 列需要包含该人员拥有的子项列表,这些子项也是人员对象,包括名称、id、性别、工作和子项。这样的结构如何存储在一个表或多个表中?解决这个问题的最佳方法是什么?
【问题讨论】:
标签: sql postgresql database-design
我需要创建一个 person 表,其列是 id、name、gender、job 和 children。然后,children 列需要包含该人员拥有的子项列表,这些子项也是人员对象,包括名称、id、性别、工作和子项。这样的结构如何存储在一个表或多个表中?解决这个问题的最佳方法是什么?
【问题讨论】:
标签: sql postgresql database-design
需要包含子列表
这不是在关系数据库中的做法。虽然理论上是可能的,但这会构成糟糕的设计。
在这种情况下,您可能想反过来做:存储一个人的 父母 的 ID。这样您就可以轻松地检索所有孩子,而无需通过存储“列表”来进行反规范化:
create table person
(
id integer primary key,
name varchar(100) not null,
gender varchar(10),
job varchar(100),
parent_id integer references person
);
如果要获取一个人和所有孩子,请使用recursive common table expression
with recursive person_list as (
select *
from person
where name = 'Arthur' -- the person we want all children for
union all
select child.*
from person child
join person_list parent on parent.id = child.parent_id
)
select *
from person_list;
【讨论】: