如何存储和查询具有树结构的数据库
How to store and query a database with tree structure
我是传销网络的成员,也是一名开发人员。我的问题是关于构建具有无限级别的 MLM 软件的数据库结构。示例:
人 1(6000 人是他的网络 - 但只有 4 人直接链接到他)
如何存储该数据并查询他的网络产生了多少点?
我可能会使用多对多关系来做到这一点,但是一旦我们拥有大量用户和庞大的网络,查询和遍历这些记录的成本就会很高。
在任何数据库中,如果 "tree" 的每个成员都具有相同的属性,最好使用自引用 table,尤其是当每棵树有 1 个且只有 1 个直接父代时。
IE.
HR
------
ID
first_name
last_name
department_id
sal
boss_hr_id (referneces HR.ID)
一般大boss都会有一个NULLboss_hr_id
要查询这样的结构,在postgres中,可以使用CTEs("with recursive"语句)
对于上面的 table,这样的查询将起作用:
with recursive ret(id, first_name, last_name, dept_id,boss_hr_id) as
(
select * from hr
where hr.id=**ID_OF_PERSON_YOU_ARE_QUERYING_STRUCTURE**
union
select hr.id, hr.first_name, hr.last_name,hr.dept_id,hr.boss_hr_id, lev+1 from hr
inner join ret on ret.boss_hr_id=hr.hr_id
)
select * from ret
)
我是传销网络的成员,也是一名开发人员。我的问题是关于构建具有无限级别的 MLM 软件的数据库结构。示例:
人 1(6000 人是他的网络 - 但只有 4 人直接链接到他)
如何存储该数据并查询他的网络产生了多少点?
我可能会使用多对多关系来做到这一点,但是一旦我们拥有大量用户和庞大的网络,查询和遍历这些记录的成本就会很高。
在任何数据库中,如果 "tree" 的每个成员都具有相同的属性,最好使用自引用 table,尤其是当每棵树有 1 个且只有 1 个直接父代时。
IE.
HR
------
ID
first_name
last_name
department_id
sal
boss_hr_id (referneces HR.ID)
一般大boss都会有一个NULLboss_hr_id
要查询这样的结构,在postgres中,可以使用CTEs("with recursive"语句)
对于上面的 table,这样的查询将起作用:
with recursive ret(id, first_name, last_name, dept_id,boss_hr_id) as
(
select * from hr
where hr.id=**ID_OF_PERSON_YOU_ARE_QUERYING_STRUCTURE**
union
select hr.id, hr.first_name, hr.last_name,hr.dept_id,hr.boss_hr_id, lev+1 from hr
inner join ret on ret.boss_hr_id=hr.hr_id
)
select * from ret
)