设计组织结构

时间:2014-05-26 04:43:02

标签: database

在一次采访中询问了这个问题。设计组织结构,员工可以拥有直接报告,间接报告(即报告者的报告者)。设计应该是这样的,在单个查询中,它应该能够检索直接或间接的报告者或两者。

我建议,

Employee
----------
id 
name

Reportee
------
emp_id FK
reportee_id FK
isDirect

采访者说乐观的解决方案是

Employee
-------
id
name
reporting_path like (a>b>c)

添加额外的表,占用更多空间,但查询将更快执行。我说由于字符串匹配,基于路径的方法很糟糕并且会产生糟糕的性能。

那么哪种方法是乐观的?

1 个答案:

答案 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