在一次采访中询问了这个问题。设计组织结构,员工可以拥有直接报告,间接报告(即报告者的报告者)。设计应该是这样的,在单个查询中,它应该能够检索直接或间接的报告者或两者。
我建议,
Employee
----------
id
name
Reportee
------
emp_id FK
reportee_id FK
isDirect
采访者说乐观的解决方案是
Employee
-------
id
name
reporting_path like (a>b>c)
添加额外的表,占用更多空间,但查询将更快执行。我说由于字符串匹配,基于路径的方法很糟糕并且会产生糟糕的性能。
那么哪种方法是乐观的?
答案 0 :(得分:2)
面试官的方法很愚蠢,因为它没有使用参照完整性。
对于纯粹的分层模型(员工不能向一个以上的老板报告),那么这是最好的方法:
create table employees (
employee_id int primary key,
name varchar(whatever) not null,
supervisor_id int null references employees(employee_id)
);
insert into employees (employee_id, name, supervisor_id) values
(1, 'Big Boss Bill', null),
(2, 'Vice President Victor', 1),
(3, 'Underling Ulysses', 2),
(4, 'Subordinate Sam', 2);
然后,您可以使用Recursive Common Table Expressions查询报告。
这里有一些示例查询:
http://blog.databasepatterns.com/2014/02/trees-paths-recursive-cte-postgresql.html