āđāļāļāļāļģāļĨāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļĢāđāļ PostgreSQL: adjacency lists āļāļąāļ closure
āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļ adjacency list āļāļąāļ closure table āđāļāļāļēāļĢāļāļāļāđāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļĢāļāļ PostgreSQL āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāļāļąāļāđāļāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļāļ āļĢāļēāļĒāļāļēāļ āđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđ

āļŠāļīāđāļāļāļĩāđāļāļąāļāļāļāļāđāļāļĢāļāđāļāļāļĢāļāļāļĢāļąāļ
āļāļąāļāļāļāļāđāļāļĢāļāļ·āļāđāļāļāļāļĩāđāļ§āđāļēāļĢāļēāļĒāļāļēāļāđāļāļĢāđāļŦāđāđāļāļĢ āđāļĨāļ°āļāļĩāļĄāļāđāļēāļ āđ āļĢāļ§āļĄāļāļąāļāđāļāđāļāđāļāļāļāļāļĒāđāļēāļāđāļĢ āđāļĄāļ·āđāļāļāļļāļāļāļāļāđāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļĢāđāļ PostgreSQL āļāļļāļāđāļĄāđāđāļāđāđāļāđāđāļāđāļ manager_id āđāļāđāļāđāļĨāļ°āļāļāđāļāđāļēāļāļąāđāļ āđāļāđāļāđāļāļāļĢāļāļāļĢāļąāļāļāļēāļāļāļĢāļīāļ: āļāļēāļĢāđāļĢāļĩāļĒāļāļāļđāđāļāļĢāļāļŠāļĢāđāļēāļ, āļĢāļēāļĒāļāļēāļ āđāļĨāļ°āļāļāļāļēāļĢāđāļāđāļēāļāļķāļ
āļāļđāđāđāļāđāļŠāđāļ§āļāđāļŦāļāđāļāļēāļāļŦāļ§āļąāļāļŠāļēāļĄāļāļĒāđāļēāļāđāļŦāđāļĢāļđāđāļŠāļķāļāļ§āđāļēāđāļāđāļāļāļąāļāļāļĩ: āļāļēāļĢāļŠāļģāļĢāļ§āļāļāļāļāđāļāļĢ āļāļēāļĢāļāđāļāļŦāļēāļāļ āđāļĨāļ°āļāļēāļĢāļāļĢāļāļāļāļĨāļĨāļąāļāļāđāđāļŦāđāđāļāđāļ "āļāļ·āđāļāļāļĩāđāļāļāļāļāļąāļ" āļāļ§āļāđāļāļēāļĒāļąāļāļāļēāļāļŦāļ§āļąāļāđāļŦāđāļāļēāļĢāļāļąāļāđāļāļāļāļĨāļāļāļ āļąāļĒ āđāļĄāļ·āđāļāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļ āđāļāļāļ āļđāļĄāļīāļāđāļāļāļāļąāļāđāļāļāļāļļāļāļāļĩāđāđāļāļĒāđāļĄāđāļāļģāđāļŦāđāļĢāļēāļĒāļāļēāļāļŦāļĢāļ·āļāļŠāļīāļāļāļīāđāļāļąāļ
āđāļāļāļēāļāļāļāļīāļāļąāļāļī āđāļāļāļāļģāļĨāļāļāļāļĩāđāļāļĩāļāđāļāļāļāļāļāļāļģāļāļēāļĄāļāļĩāđāđāļāļīāļāļāđāļģāđāļāđāđāļĄāđāļāļĩāđāļāđāļ:
- āļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļēāļāļāļāļāļāļāļĩāđāļāļ·āļāļāļ°āđāļĢ (āļāļķāđāļāđāļāļāļāļāļķāļāļĢāļ°āļāļąāļāļāļāļŠāļļāļ)?
- āđāļāļĢāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđ (āļāļđāđāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļāđāļĨāļ° subtree āļāļąāđāļāļŦāļĄāļ)?
- āļāļāļāļĨāļļāđāļĄāļāļąāļāđāļāđāļāļāļĩāļĄāđāļĨāļ°āđāļāļāļāļāļĒāđāļēāļāđāļĢāļŠāļģāļŦāļĢāļąāļāđāļāļāļāļāļĢāđāļ?
- āļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļīāļāļāļķāđāļāđāļāļĒāđāļĄāđāļŠāļ°āļāļļāļāļāļĒāđāļēāļāđāļĢ?
- āđāļāļĢāđāļŦāđāļāļāļ°āđāļĢāđāļāđāļāđāļēāļ āļāļēāļĄāļĢāļđāļāļāļĢāļāļāļāļāļāļāļāđāļāļĢ?
āļĄāļąāļāļāļąāļāļāđāļāļāļāļ§āđāļēāđāļāđāļāđāļāđāļĄāđāļāļĢāļĢāļĄāļāļēāđāļāļĢāļēāļ°āļāļāļāđāļāļĢāđāļāļĨāļĩāđāļĒāļāļāđāļāļĒ āļāļĩāļĄāļĒāđāļēāļĒāļāđāļēāļĄāđāļāļāļ āļāļđāđāļāļąāļāļāļēāļĢāļŠāļĨāļąāļāļāļĨāļļāđāļĄ āđāļĨāļ°āļāļēāļāļĄāļļāļĄāļĄāļāļāđāļĄāđāđāļāđāđāļāđāļāđāļāļĩāļĒāļ "āļāļāļĢāļēāļĒāļāļēāļāļāļ" āļāļąāļ§āļāļĒāđāļēāļ: āļāļāļŦāļāļķāđāļāļāļĒāļđāđāđāļāļāļĩāļĄ āđāļĨāļ°āļāļĩāļĄāđāļāđāļāļāļāļāđāļāļāļ āļŠāļīāļāļāļīāđāđāļāļīāđāļĄāļāļĩāļāļāļąāđāļ: āļĢāļđāļāļĢāđāļēāļāļāļāļāļāļāļāđāļāļĢāļāļĨāļēāļĒāđāļāđāļāļŠāđāļ§āļāļŦāļāļķāđāļāļāļāļāđāļĄāđāļāļĨāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ āđāļĄāđāđāļāđāđāļāđāđāļāļāļ°āđāļāļĢāļĄ
āļāļģāļĻāļąāļāļāđāļāļēāļāļāļģāļāđāļ§āļĒāđāļŦāđāļāļēāļĢāļāļāļāđāļāļāļāļąāļāđāļāļ:
- āđāļŦāļāļāļāļ·āļāļĢāļēāļĒāļāļēāļĢāļŦāļāļķāđāļāđāļāļĨāļģāļāļąāļāļāļąāđāļ (āļāļļāļāļāļĨ āļāļĩāļĄ āļŦāļĢāļ·āļāđāļāļāļ)
- āđāļĄāđāļāļ·āļāđāļŦāļāļāļāļĩāđāļāļĒāļđāđāđāļŦāļāļ·āļāđāļāļĒāļāļĢāļ (āļāļđāđāļāļąāļāļāļēāļĢ āļŦāļĢāļ·āļāđāļāļāļāļāļĩāđāđāļāđāļāđāļāđāļēāļāļāļāļāļĩāļĄ)
- āļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļ·āļāđāļŦāļāļāđāļ āđ āļāļĩāđāļāļĒāļđāđāđāļŦāļāļ·āļāđāļāļĢāļ°āļĒāļ°āļāļēāļāđāļāļāđāđāļāđ (āļāļđāđāļāļąāļāļāļēāļĢāļāļāļāļāļđāđāļāļąāļāļāļēāļĢāļāļāļāļāļļāļ)
- āļāļēāļĒāļēāļāļāļ·āļāđāļŦāļāļāđāļ āđ āļāļĩāđāļāļĒāļđāđāļāđāļēāļāļĨāđāļēāļāđāļāļĢāļ°āļĒāļ°āļāļēāļāđāļāļāđāđāļāđ (āļāļļāļāļāļāļāļĩāđāļāļĒāļđāđāđāļāđāļāļļāļ)
āļāļąāļ§āļāļĒāđāļēāļ: āļāđāļēāđāļāļāļāļāļēāļĒ (Sales) āļĒāđāļēāļĒāđāļāļāļĒāļđāđāđāļāđ VP āļāļāđāļŦāļĄāđ āļŠāļāļāļāļĒāđāļēāļāļāļĩāđāļāđāļāļāļĒāļąāļāļāļāđāļāđāļāļāļĢāļīāļāļāļąāļāļāļĩ āđāļāļāļāļāļĢāđāļāļĒāļąāļāļāļĢāļāļ "āļāļąāđāļāđāļāļāļ Sales" āđāļāđ āđāļĨāļ°āļŠāļīāļāļāļīāđāļāļāļ VP āļāļāđāļŦāļĄāđāļāļĢāļāļāļāļĨāļļāļĄ Sales āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
āļāļēāļĢāļāļąāļāļŠāļīāļāđāļāļāđāļāļāđāļĨāļ·āļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļēāļĢāļēāļ
āļāđāļāļāļāļąāļāļŠāļīāļāđāļ schema āļāļąāļāđāļāļāļ§āđāļēāļĄāļĩāļāļģāļāļēāļĄāļāļ°āđāļĢāļāļĩāđāđāļāļāļāļāļāļāļļāļāļāđāļāļāļāļāļāļāļļāļāļ§āļąāļ "āđāļāļĢāļĢāļēāļĒāļāļēāļāđāļāļĢ?" āđāļāđāļāđāļāļĩāļĒāļāļāļļāļāđāļĢāļīāđāļĄāļāđāļ āļŦāļĨāļēāļĒāļāļąāļāļāļāļāđāļāļĢāļĒāļąāļāļāđāļāļāļāļāļāļ§āđāļēāđāļāļĢāđāļāđāļāļŦāļąāļ§āļŦāļāđāļēāđāļāļāļ āđāļāļĢāļāļāļļāļĄāļąāļāļīāļāļēāļĢāļĨāļēāļāļāļāļāļĩāļĄ āđāļĨāļ°āđāļāļĢāļŠāļēāļĄāļēāļĢāļāļāļđāļĢāļēāļĒāļāļēāļāđāļāđ
āļāļāļāļģāļāļēāļĄāļāļĩāđāļŦāļāđāļēāļāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāļāļ°āļāļēāļĄ āļŦāļēāļāļāļļāļāļāļāļāļāļģāļāļēāļĄāđāļĄāđāđāļāđāļāļąāđāļāđāļāļĨāļ§āđāļēāļāļ°āđāļāđāļŠāļāļĩāļĄāļēāļāļĩāđ "āļāļđāđāļŦāļĄāļēāļ°" āđāļāđāļĒāļēāļāļāđāļāļāļēāļĢāļāļīāļ§āļĢāļĩ
āļāļēāļĢāļāļąāļāļŠāļīāļāđāļāļāļĩāđāļāļģāļŦāļāļāļāļļāļāļāļĒāđāļēāļ:
- āļāļīāļ§āļĢāļĩāđāļŦāļāļāđāļāļāđāļĢāđāļ§: āļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ āļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļēāļāļāļāļķāļ CEO subtree āļāļąāđāļāļŦāļĄāļāđāļāđāļŦāļąāļ§āļŦāļāđāļē āļŦāļĢāļ·āļ "āļāļļāļāļāļāđāļāđāļāļāļāļāļĩāđ"?
- āđāļāđāļāļāđāļāđāļĄāđāđāļāļāđāļāļĢāđāļāļāļĢāļąāļ (āļāļđāđāļāļąāļāļāļēāļĢāļāļāđāļāļĩāļĒāļ§) āļŦāļĢāļ·āļāļāļāļāđāļāļĢāđāļāļāđāļĄāļāļĢāļīāļāļāđ (āļŦāļĨāļēāļĒāļāļđāđāļāļąāļāļāļēāļĢāļŦāļĢāļ·āļāļŦāļąāļ§āļŦāļāđāļē)?
- āđāļāļāļāđāļāđāļāđāļŦāļāļāđāļāļĨāļģāļāļąāļāļāļąāđāļāđāļāļĩāļĒāļ§āļāļąāļāļāļāļŦāļĢāļ·āļāđāļāđāļ attribute āđāļĒāļ (āđāļāđāļ
department_idāđāļāđāļāđāļĨāļ°āļāļ)? - āđāļāļĢāļŠāļēāļĄāļēāļĢāļāļāļĒāļđāđāļŦāļĨāļēāļĒāļāļĩāļĄāđāļāđāļŦāļĢāļ·āļāđāļĄāđ (shared services, squads)?
- āļŠāļīāļāļāļīāđāđāļŦāļĨāļāļĒāđāļēāļāđāļĢ: āļĨāļāļāđāļāđāļĄāđ āļāļķāđāļāļāđāļāđāļĄāđ āļŦāļĢāļ·āļāļāļąāđāļāļŠāļāļ?
āļāļēāļĢāđāļĨāļ·āļāļāđāļŦāļĨāđāļēāļāļĩāđāļāļģāļŦāļāļāļ§āđāļē "āļāđāļāļĄāļđāļĨāļāļĩāđāļāļđāļāļāđāļāļ" āđāļāđāļāļāļĒāđāļēāļāđāļĢ āļŦāļēāļ Alex āļāļģāļāļąāđāļāļāđāļēāļĒ Support āđāļĨāļ° Onboarding manager_id āđāļāļĩāļĒāļ§āļŦāļĢāļ·āļāļāļ "āļŦāļāļķāđāļāļŦāļąāļ§āļŦāļāđāļēāļāđāļāļāļĩāļĄ" āļāļēāļāđāļĄāđāļāļ āļāļļāļāļāļēāļāļāđāļāļāļāļēāļĢāļāļēāļĢāļēāļāđāļāļ·āđāļāļĄ (leader-to-team) āļŦāļĢāļ·āļāļāļāļāļąāļāđāļāļāđāļāđāļ "āļāļĩāļĄāļŦāļĨāļąāļāļŦāļāļķāđāļāļāļĩāļĄ āļāļ§āļāļāļĩāļĄ dotted-line"
āđāļāļāļāđāļāđāļāļāļĩāļāļāļēāļāđāļĨāļ·āļāļāļŦāļāļķāđāļ āļŦāļēāļāđāļāļāļāđāļāđāļāđāļŦāļāļ āļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļŠāļāļ "āđāļāļāļ A āļĢāļ§āļĄāļāļĩāļĄ B āļĢāļ§āļĄāļāļ C" āļŦāļēāļāđāļāļāļāđāļāđāļāđāļĒāļ āļāļļāļāļāļ°āļāļĢāļāļāļāđāļ§āļĒ department_id = X āļāļķāđāļāđāļĢāļīāđāļĄāļāđāļēāļĒāđāļāđāļāļ°āđāļāļāđāļĄāļ·āđāļāļāļĩāļĄāļāđāļēāļĄāđāļāļāļ
āļŠāļļāļāļāđāļēāļĒ āļāļīāļĒāļēāļĄāļŠāļīāļāļāļīāđāđāļāđāļāļ āļēāļĐāļēāļāđāļēāļĒ āđ "āļāļđāđāļāļąāļāļāļēāļĢāļāļđāđāļāļīāļāđāļāļ·āļāļāļāļāđāļāđāđāļāđāļāļąāđāļāļŦāļĄāļ āđāļāđāđāļĄāđāđāļāđāđāļāļ·āđāļāļāļĢāđāļ§āļĄāļāļēāļ" āđāļāđāļāļāļāļĨāļāļāđāļāđāļĄāđ "āđāļāļĢāļāđāđāļāđāļāļđāļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļēāļāļāļāļāļąāļ§āđāļāļ" āđāļāđāļāļāļāļāļķāđāļāļāđāļāđāļĄāđ āļāļąāļāļŠāļīāļāđāļāđāļāđāđāļāļīāđāļ āđ āđāļāļĢāļēāļ°āļĄāļąāļāđāļāļĨāļĩāđāļĒāļāļ§āđāļēāđāļāļāļāļģāļĨāļāļāļĨāļģāļāļąāļāļāļąāđāļāđāļāļāļ°āđāļŦāļĄāļēāļ° āđāļĨāļ°āđāļāļāđāļāļāļ°āļāļģāđāļŦāđāđāļāļīāļāļāļīāļ§āļĢāļĩāđāļāļāļ āļēāļĒāļŦāļĨāļąāļ
Adjacency list: āļŠāļāļĩāļĄāļēāļāđāļēāļĒāļŠāļģāļŦāļĢāļąāļāļāļđāđāļāļąāļāļāļēāļĢāđāļĨāļ°āļāļĩāļĄ
āļāđāļēāļāļļāļāļāđāļāļāļāļēāļĢāļŠāđāļ§āļāļāļĢāļ°āļāļāļāđāļŦāđāļāđāļāļĒāļāļĩāđāļŠāļļāļ adjacency list āđāļāđāļāļāļļāļāđāļĢāļīāđāļĄāļāđāļāļāļĨāļēāļŠāļŠāļīāļ āđāļāđāļĨāļ°āļāļāđāļāđāļāļāļāļĒāļāđāđāļāļāļĢāđāđāļāļĒāļąāļāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ āđāļĨāļ°āļāđāļāđāļĄāđāļŠāļĢāđāļēāļāļāļēāļāļāļēāļĢāļāļēāļĄāļāļāļĒāļāđāđāļāļāļĢāđāđāļŦāļĨāđāļēāļāļąāđāļ
āļāļēāļĢāļāļąāđāļāļāđāļēāļāļąāđāļāļāđāļģāđāļāđāļāđāļāļāļāļĩāđ:
create table departments (
id bigserial primary key,
name text not null unique
);
create table teams (
id bigserial primary key,
department_id bigint not null references departments(id),
name text not null,
unique (department_id, name)
);
create table employees (
id bigserial primary key,
full_name text not null,
team_id bigint references teams(id),
manager_id bigint references employees(id)
);
āļāļļāļāļāļēāļāļāđāļēāļĄāļāļēāļĢāļēāļāđāļĒāļāđāļĨāļ°āđāļāđāļ department_name āđāļĨāļ° team_name āđāļāđāļāļāļāļĨāļąāļĄāļāđāļāļ employees āđāļāđ āļāļķāđāļāđāļĢāļīāđāļĄāđāļĢāđāļ§āļāļ§āđāļē āđāļāđāļĒāļēāļāļĢāļąāļāļĐāļēāļāļ§āļēāļĄāļŠāļ°āļāļēāļ (āļŠāļ°āļāļāļāļīāļ āđāļāļĨāļĩāđāļĒāļāļāļ·āđāļāļāļĩāļĄ āđāļĨāļ°āļāļēāļĢāļĢāļēāļĒāļāļēāļāļāļĩāđāđāļĄāđāļŠāļāļāļāļĨāđāļāļ) āļāļēāļĢāļēāļāđāļĒāļāļāļģāđāļŦāđāļāļēāļĢāļāļĢāļāļāđāļĨāļ°āļāļāļŠāļīāļāļāļīāđāļāļāļīāļāļēāļĒāđāļāđāļāđāļēāļĒāļāļķāđāļ
āđāļŠāđāđāļāļĢāļēāļ°āļāđāļāļāļāļąāļāļāļąāđāļāđāļāđāļāđāļ āļāđāļāļĄāļđāļĨāļĨāļģāļāļąāļāļāļąāđāļāļāļĩāđāļāļīāļāļāļĨāļēāļāđāļāđāļĒāļēāļāļāļĩāļŦāļĨāļąāļ āļāļąāđāļāļāđāļģāļŠāļļāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļāļąāļ§āđāļāļ (manager_id <> id) āđāļĨāļ°āļāļąāļāļŠāļīāļāđāļāļ§āđāļēāļāļđāđāļāļąāļāļāļēāļĢāļŠāļēāļĄāļēāļĢāļāļāļĒāļđāđāļāļāļāļāļĩāļĄāļŦāļĢāļ·āļāđāļāļāļāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļŦāļĢāļ·āļāđāļĄāđ āđāļĨāļ°āļ§āđāļēāļāđāļāļāļāļēāļĢ soft deletes āļŦāļĢāļ·āļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļāļīāļāļāļĢāļ°āļ§āļąāļāļīāļĻāļēāļŠāļāļĢāđāļŦāļĢāļ·āļāđāļĄāđ (āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļēāļĒāļāļēāļ)
āļāļąāļ adjacency list āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļŠāđāļ§āļāđāļŦāļāđāđāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāļāļĢāļĢāļĄāļāļē: āđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢāļāļąāļāđāļāļ employees.manager_id āđāļĨāļ°āļĒāđāļēāļĒāļāļĩāļĄāļāļąāļāđāļāļ employees.team_id (āļĄāļąāļāļāļ°āļāļĢāđāļāļĄāļāļąāļāļāļđāđāļāļąāļāļāļēāļĢ) āļāđāļāđāļŠāļĩāļĒāļāļ·āļāļāļēāļĢāđāļāļĩāļĒāļāđāļĨāđāļāļāđāļāļĒāļāļēāļāļĄāļĩāļāļĨāļāļĢāļ°āļāļāļĄāļēāļ downstream āļāļĨāļĢāļ§āļĄāļĢāļēāļĒāļāļēāļāđāļāļĨāļĩāđāļĒāļ āđāļĨāļ°āļāļ "āļāļđāđāļāļąāļāļāļēāļĢāđāļŦāđāļāļĢāļēāļĒāļāļēāļāļāļąāđāļāļŦāļĄāļ" āļāđāļāļāļāļēāļĄāļŠāļēāļĒāđāļŦāļĄāđ
āļāļ§āļēāļĄāđāļĢāļĩāļĒāļāļāđāļēāļĒāļāļĩāđāļāļ·āļāļāļļāļāđāļāđāļāđāļŦāļāđāļāļāļ adjacency list āļāļļāļāļāđāļāļāļāļĢāļēāļāļāđāļĄāļ·āđāļāļāļļāļāļāļĢāļāļāļāđāļāļĒ āđ āļāđāļ§āļĒ "āļāļļāļāļāļāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđ" āđāļāļĢāļēāļ°āļĄāļąāļāļāđāļāļāļāļķāđāļāļāļēāļĢāļāļīāļ§āļĢāļĩ recursive āđāļāļ·āđāļāđāļāļīāļāļāđāļāđāļĄāđāļāļļāļāļāļĢāļąāđāļ
Adjacency list: āļāļīāļ§āļĢāļĩāļāļąāđāļ§āđāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļāļāđāļĨāļ°āļĢāļēāļĒāļāļēāļ
āļāļąāļ adjacency list āļāļģāļāļēāļĄāļāļąāļāļāļāļāđāļāļĢāļāļĩāđāļĄāļĩāļāļĢāļ°āđāļĒāļāļāđāļŦāļĨāļēāļĒāļāļĒāđāļēāļāļāļ°āļāļĨāļēāļĒāđāļāđāļāļāļīāļ§āļĢāļĩāđāļāļ recursive āļāđāļēāļāļļāļāļāļāļāđāļāļāļāļąāļāļāļāļāđāļāļĢāđāļ PostgreSQL āđāļāļāļāļĩāđ āļāļĩāđāļāļ·āļāļĢāļđāļāđāļāļāļāļĩāđāļāļļāļāļāļ°āđāļāđāļāđāļāļĒ
āļāļđāđāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļ (āļĢāļ°āļāļąāļāđāļāļĩāļĒāļ§)
āļāļĢāļāļĩāļāļĩāđāļāđāļēāļĒāļāļĩāđāļŠāļļāļāļāļ·āļāļāļĩāļĄāđāļāļĒāļāļĢāļāļāļāļāļāļđāđāļāļąāļāļāļēāļĢ:
SELECT id, full_name, title
FROM employees
WHERE manager_id = $1
ORDER BY full_name;
āļāļĩāđāđāļĢāđāļ§āđāļĨāļ°āļāđāļēāļāļāđāļēāļĒ āđāļāđāļĨāļāđāļāđāđāļāđāļĢāļ°āļāļąāļāđāļāļĩāļĒāļ§
āļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļē (āļāļķāđāļāđāļ)
āđāļāļ·āđāļāđāļŠāļāļāļ§āđāļēāđāļāļĢāļāļ·āļāļāļđāđāļāļĩāđāļāļāļŦāļāļķāđāļāļĢāļēāļĒāļāļēāļ (āļāļđāđāļāļąāļāļāļēāļĢ āļāļđāđāļāļąāļāļāļēāļĢāļāļāļāļāļđāđāļāļąāļāļāļēāļĢ āđāļāđāļāļāđāļ) āđāļāđ recursive CTE:
WITH RECURSIVE chain AS (
SELECT id, full_name, manager_id, 0 AS depth
FROM employees
WHERE id = $1
UNION ALL
SELECT e.id, e.full_name, e.manager_id, c.depth + 1
FROM employees e
JOIN chain c ON e.id = c.manager_id
)
SELECT *
FROM chain
ORDER BY depth;
āļāļĩāđāļĢāļāļāļĢāļąāļāļāļēāļĢāļāļāļļāļĄāļąāļāļī āđāļŠāđāļāļāļēāļāļāļēāļĢāļĒāļāļĢāļ°āļāļąāļ āđāļĨāļ° breadcrumb āļāļāļāļāļđāđāļāļąāļāļāļēāļĢ
subtree āļāļąāđāļāļŦāļĄāļ (āļĨāļāđāļ)
āđāļāļ·āđāļāđāļŦāđāđāļāđāļāļļāļāļāļāđāļāđāļŦāļąāļ§āļŦāļāđāļē (āļāļļāļāļĢāļ°āļāļąāļ) āļāļĨāļīāļāļāļēāļĢ recursion:
WITH RECURSIVE subtree AS (
SELECT id, full_name, manager_id, department_id, 0 AS depth
FROM employees
WHERE id = $1
UNION ALL
SELECT e.id, e.full_name, e.manager_id, e.department_id, s.depth + 1
FROM employees e
JOIN subtree s ON e.manager_id = s.id
)
SELECT *
FROM subtree
ORDER BY depth, full_name;
āļĢāļēāļĒāļāļēāļāļāļĩāđāļāļāđāļāđāļāđāļāļĒāļāļ·āļ "āļāļļāļāļāļāđāļāđāļāļāļ X āđāļāđāļŦāļąāļ§āļŦāļāđāļē Y":
WITH RECURSIVE subtree AS (
SELECT id, department_id
FROM employees
WHERE id = $1
UNION ALL
SELECT e.id, e.department_id
FROM employees e
JOIN subtree s ON e.manager_id = s.id
)
SELECT e.*
FROM employees e
JOIN subtree s ON s.id = e.id
WHERE e.department_id = $2;
āļāļīāļ§āļĢāļĩ adjacency list āļāļēāļāđāļŠāļĩāđāļĒāļāļāļąāļāļŠāļīāļāļāļīāđāđāļāļĢāļēāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāļĄāļąāļāļāļķāđāļāļāļąāļāđāļŠāđāļāļāļēāļāđāļāđāļĄ (āļāļđāđāļāļđāđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļāļāļĩāđāļŦāļĢāļ·āļāđāļĄāđ?) āļāđāļē endpoint āđāļāļĨāļ·āļĄ recursion āļŦāļĢāļ·āļāđāļāđāļāļīāļĨāđāļāļāļĢāđāļāļīāļāļāļĩāđ āļāļļāļāļāļēāļāđāļāļīāļāđāļāļĒāđāļāļ§ āļāļāļāļāļēāļāļāļĩāđāđāļŦāđāļĢāļ°āļ§āļąāļāļāļąāļāļŦāļēāļāđāļāļĄāļđāļĨāđāļāđāļāļ§āļāļāļĢāđāļĨāļ°āļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđāļŦāļēāļĒāđāļ āļĢāļ°āđāļāļĩāļĒāļāļāļīāļāđāļāļĩāļĒāļāđāļĨāđāļāļāđāļāļĒāļŠāļēāļĄāļēāļĢāļāļāļģāđāļŦāđ recursion āļāļąāļāļŦāļĢāļ·āļāļŠāđāļāļāļĨāļĨāļąāļāļāđāđāļĄāđāļāļēāļāļāļīāļ āļāļąāļāļāļąāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđāļāđāļāļāļĄāļĩāļāļēāļĢāļāđāļāļāļāļąāļāđāļĨāļ°āļāđāļāļāļģāļāļąāļāļāļĩāđāļāļĩ
Closure table: āļĄāļąāļāđāļāđāļāļĨāļģāļāļąāļāļāļąāđāļāļāļąāđāļāļŦāļĄāļāļāļĒāđāļēāļāđāļĢ
Closure table āđāļāđāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļāļĢāļĢāļāļāļļāļĢāļļāļĐ-āļāļēāļĒāļēāļāļāļļāļāļāļđāđ āđāļĄāđāđāļāđāđāļāđāļĨāļīāļāļāđāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ āđāļāļāļāļĩāđāļāļ°āđāļāļīāļāļāđāļāđāļĄāđāļāļĩāļĨāļ°āļāđāļēāļ§ āļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļēāļĄāļ§āđāļē: "āđāļāļĢāļāļĒāļđāđāđāļāđāļŦāļąāļ§āļŦāļāđāļēāļāļĩāđ?" āđāļĨāđāļ§āđāļāđāļāļģāļāļāļāļāļąāđāļāļŦāļĄāļāļāđāļ§āļĒāļāļēāļĢ join āđāļāļĩāļĒāļ§
āļāļļāļāļĄāļąāļāđāļāđāļāļŠāļāļāļāļēāļĢāļēāļ: āļŦāļāļķāđāļāļŠāļģāļŦāļĢāļąāļāđāļŦāļāļ (āļāļāļŦāļĢāļ·āļāļāļĩāļĄ) āđāļĨāļ°āļŦāļāļķāđāļāļŠāļģāļŦāļĢāļąāļāđāļŠāđāļāļāļēāļāļĨāļģāļāļąāļāļāļąāđāļ
-- nodes
employees (
id bigserial primary key,
name text not null,
manager_id bigint null references employees(id)
)
-- closure
employee_closure (
ancestor_id bigint not null references employees(id),
descendant_id bigint not null references employees(id),
depth int not null,
primary key (ancestor_id, descendant_id)
)
Closure table āđāļāđāļāļāļđāđāđāļāđāļ (Alice, Bob) āļŦāļĄāļēāļĒāļāļķāļ "Alice āđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļ Bob" āļĒāļąāļāđāļāđāļāđāļāļ§āļāļĩāđ ancestor_id = descendant_id āļāļĢāđāļāļĄ depth = 0 āđāļāļ§āļāļąāļ§āđāļāļāļāļąāđāļāļāļđāđāļāļĨāļāđāļāļāļāļāđāļĢāļ āđāļāđāļāļģāđāļŦāđāļŦāļĨāļēāļĒāļāļīāļ§āļĢāļĩāļŠāļ°āļāļēāļāļāļķāđāļ
depth āļāļāļāļ§āđāļēāļŦāđāļēāļāļāļąāļāđāļāđāļēāđāļĢ: depth = 1 āļāļ·āļāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ depth = 2 āļāļ·āļāļāļđāđāļāļąāļāļāļēāļĢāļāļāļāļāļđāđāļāļąāļāļāļēāļĢ āđāļāđāļāļāđāļ āļāļĩāđāļŠāļģāļāļąāļāđāļĄāļ·āđāļāļāļđāđāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļāļāļ§āļĢāļāļąāļāļāļēāļĢāļāđāļēāļāļāļēāļāļāļđāđāļĢāļēāļĒāļāļēāļāļāļēāļāļāđāļāļĄ
āļāļĢāļ°āđāļĒāļāļāđāļŦāļĨāļąāļāļāļ·āļāļāļēāļĢāļāđāļēāļāļāļĩāđāļāļēāļāđāļāļēāđāļāđāđāļĨāļ°āļĢāļ§āļāđāļĢāđāļ§:
- āļāļēāļĢāļāđāļāļŦāļē subtree āļāļąāđāļāļŦāļĄāļāđāļĢāđāļ§ (āļāļļāļāļāļāđāļāđāļāļđāđāļāļģāļāļ§āļĒāļāļēāļĢ)
- āļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļēāļāđāļēāļĒ (āļāļđāđāļāļąāļāļāļēāļĢāļāļąāđāļāļŦāļĄāļāđāļŦāļāļ·āļāđāļāļĢāļŠāļąāļāļāļ)
- āļāļļāļāđāļĒāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāđāļāļĒāļāļĢāļāļāļąāļāļāļēāļāļāđāļāļĄāđāļāđāđāļāļĒāđāļāđ
depth
āļāđāļāļāļļāļāļāļ·āļāļāļēāļĢāļāļģāļĢāļļāļāļĢāļąāļāļĐāļēāđāļĄāļ·āđāļāļāļąāļāđāļāļ āļŦāļēāļ Bob āđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢāļāļēāļ Alice āđāļāđāļ Dana āļāļļāļāļāđāļāļāļŠāļĢāđāļēāļāđāļāļ§ closure āđāļŦāļĄāđāļŠāļģāļŦāļĢāļąāļ Bob āđāļĨāļ°āļāļļāļāļāļāđāļāđ Bob āļ§āļīāļāļĩāļāļąāđāļ§āđāļāļāļ·āļ: āļĨāļāđāļŠāđāļāļāļēāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāđāļāđāļēāļŠāļģāļŦāļĢāļąāļ subtree āļāļąāđāļ āđāļĨāđāļ§āđāļāļĢāļāđāļŠāđāļāļāļēāļāđāļŦāļĄāđāđāļāļĒāļāļēāļĢāļĢāļ§āļĄāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļ Dana āļāļąāļāļāļļāļāđāļŦāļāļāđāļ subtree āļāļāļ Bob āđāļĨāļ°āļāļģāļāļ§āļ depth āđāļŦāļĄāđ
Closure table: āļāļīāļ§āļĢāļĩāļāļąāđāļ§āđāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļāļāļāļĩāđāđāļĢāđāļ§
Closure table āđāļāđāļāļāļļāļāļāļđāđāļāļĢāļĢāļāļāļļāļĢāļļāļĐ-āļāļēāļĒāļēāļāđāļ§āđāļĨāđāļ§āļāļŦāļāđāļē (āļĄāļąāļāđāļāđāļ org_closure(ancestor_id, descendant_id, depth)) āļāļąāđāļāļāļģāđāļŦāđāļāļēāļĢāļāļĢāļāļāļāļāļāđāļāļĢāđāļĢāđāļ§āđāļāļĢāļēāļ°āļāļģāļāļēāļĄāļŠāđāļ§āļāđāļŦāļāđāļāļĨāļēāļĒāđāļāđāļāļāļēāļĢ join āđāļāļĩāļĒāļ§
āđāļāļ·āđāļāđāļŠāļāļāļāļļāļāļāļāđāļāđāļāļđāđāļāļąāļāļāļēāļĢ āđāļŦāđ join āļŦāļāļķāđāļāļāļĢāļąāđāļāđāļĨāđāļ§āļāļĢāļāļāļāđāļ§āļĒ depth:
-- Descendants (everyone in the subtree)
SELECT e.*
FROM employees e
JOIN org_closure c
ON c.descendant_id = e.id
WHERE c.ancestor_id = :manager_id
AND c.depth > 0;
-- Direct reports only
SELECT e.*
FROM employees e
JOIN org_closure c
ON c.descendant_id = e.id
WHERE c.ancestor_id = :manager_id
AND c.depth = 1;
āļŠāļģāļŦāļĢāļąāļāļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļē (āļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļąāđāļāļŦāļĄāļāļāļāļāļāļāļąāļāļāļēāļāļāļāļŦāļāļķāđāļ) āļāļĨāļīāļāļāļēāļĢ join:
SELECT m.*
FROM employees m
JOIN org_closure c
ON c.ancestor_id = m.id
WHERE c.descendant_id = :employee_id
AND c.depth > 0
ORDER BY c.depth;
āļāļēāļĢāļāļĢāļāļāļāļĨāļēāļĒāđāļāđāļāļāļēāļāđāļāļēāđāļāđ āļāļąāļ§āļāļĒāđāļēāļ: "āļāļļāļāļāļāđāļāđāļŦāļąāļ§āļŦāļāđāļē X āđāļāđāđāļāļāļēāļ°āđāļāđāļāļāļ Y":
SELECT e.*
FROM employees e
JOIN org_closure c ON c.descendant_id = e.id
WHERE c.ancestor_id = :leader_id
AND e.department_id = :department_id;
āđāļāļĢāļēāļ°āļĨāļģāļāļąāļāļāļąāđāļāļāļģāļāļ§āļāđāļ§āđāļĨāđāļ§āļāļŦāļāđāļē āļāļēāļĢāļāļąāļāļāđāļāļģāđāļāđāļāļĢāļāđāļāļāļĢāļāļĄāļē (āđāļĄāđāļāđāļāļ recursion) āļāđāļ§āļĒāđāļāļāļāļāļĢāđāļāđāļĨāļ°āļāļąāļ§āļāļąāļāļŠāļīāļāļāļīāđāļāļĩāđāļāļģāļāļąāļ āđāļĨāļ°āļāļģāļāļēāļāļĢāđāļ§āļĄāļāļąāļāļāļēāļĢāđāļāđāļāļŦāļāđāļēāđāļĨāļ°āļāļēāļĢāļāđāļāļŦāļēāđāļāđāļāļĩāđāļāļĢāļēāļ°āļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļāđ ORDER BY, LIMIT/OFFSET āđāļĨāļ°āļāļīāļĨāđāļāļāļĢāđāļāļĢāļāļāļāļāļļāļāļāļēāļĒāļēāļ
āđāļāđāļĨāļ°āđāļāļāļĄāļĩāļāļĨāļāļĒāđāļēāļāđāļĢāļāđāļāļŠāļīāļāļāļīāđāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļēāļĢāđāļāđāļēāļāļķāļ
āļāļāļāļāļāđāļāļĢāļāļąāđāļ§āđāļāļāļ·āļ: āļāļđāđāļāļąāļāļāļēāļĢāļāļđ (āđāļĨāļ°āļāļēāļāļāļĢāļąāđāļāđāļāđāđāļ) āļāļļāļāļāļĒāđāļēāļāļ āļēāļĒāđāļāđāļāļ āļāļēāļĢāđāļĨāļ·āļāļāļŠāļāļĩāļĄāļēāļāļ°āđāļāļĨāļĩāđāļĒāļāļ§āđāļēāļāļļāļāļāđāļāļāļāđāļēāļĒāļāđāļēāđāļāđāļāđāļēāļĒāđāļāļāđāļāļāđāļāļĒāđāļāđāđāļŦāļāđāļāļāļēāļĢāļŦāļēāļ§āđāļē "āđāļāļĢāļāļĒāļđāđāđāļāđāđāļāļĢ"
āļāļąāļ adjacency list āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđāļĄāļąāļāļāđāļāļ recursion āļŦāļēāļāļāļđāđāđāļāđāđāļāļīāļāļŦāļāđāļēāļāļĩāđāđāļŠāļāļāļāļāļąāļāļāļēāļ 200 āļāļ āļāļļāļāļĄāļąāļāļāļ°āļŠāļĢāđāļēāļāļāļļāļāļāļēāļĒāļēāļāļāđāļ§āļĒ recursive CTE āđāļĨāđāļ§āļāļĢāļāļāđāļāļ§āđāļāđāļēāļŦāļĄāļēāļĒāļāļēāļĄāļĄāļąāļ
āļāļąāļ closure table āļāļāđāļāļĩāļĒāļ§āļāļąāļāļĄāļąāļāļāļĢāļ§āļāļŠāļāļāđāļāđāļāđāļ§āļĒāļāļēāļĢāļāļāļŠāļāļāļāļēāļĢāļĄāļĩāļāļĒāļđāđāđāļāļāļāđāļēāļĒ: "āļāļđāđāđāļāđāļāļąāļāļāļļāļāļąāļāđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļāļąāļāļāļēāļāļāļĩāđāļŦāļĢāļ·āļāđāļĄāđ?" āļāđāļēāđāļāđ āļāļāļļāļāļēāļ
-- Closure table permission check (conceptual)
SELECT 1
FROM org_closure c
WHERE c.ancestor_id = :viewer_id
AND c.descendant_id = :employee_id
LIMIT 1;
āļāļ§āļēāļĄāđāļĢāļĩāļĒāļāļāđāļēāļĒāļāļĩāđāļŠāļģāļāļąāļāđāļĄāļ·āđāļāļāļļāļāļāļģ row-level security (RLS) āļĄāļēāđāļāđ āļāļĩāđāļāļķāđāļāļāļļāļāļāļīāļ§āļĢāļĩāļĢāļ§āļĄāļāļāļ§āđāļē "āļāļ·āļāđāļāļāļēāļ°āđāļāļ§āļāļĩāđāļāļđāđāļāļđāđāļŦāđāļāđāļāđ" āļāļąāļ adjacency list āļāđāļĒāļāļēāļĒāļĄāļąāļāļāļąāļ recursion āđāļĨāļ° tuning āļĒāļēāļāļāļ§āđāļē āļāļąāļ closure table āļāđāļĒāļāļēāļĒāļĄāļąāļāđāļāđāļ EXISTS (...) āļāļĩāđāļāļĢāļāđāļāļāļĢāļāļĄāļē
āļāļāļāđāļāļāļāļīāđāļĻāļĐāđāļāđāļāļāļĩāđāļāļĩāđāļāļĢāļĢāļāļ°āļŠāļīāļāļāļīāđāļĄāļąāļāļāļąāļāļĄāļēāļāļāļĩāđāļŠāļļāļ:
- āļāļēāļĢāļĢāļēāļĒāļāļēāļāđāļāļ dotted-line: āļāļāļŦāļāļķāđāļāļĄāļĩāļāļđāđāļāļąāļāļāļēāļĢāļŠāļāļāļāļāļāļĢāļīāļ āđ
- āļāļđāđāļāđāļ§āļĒāđāļĨāļ°āļāļđāđāđāļāđāļĢāļąāļāļĄāļāļāļŦāļĄāļēāļĒ: āļāļēāļĢāđāļāđāļēāļāļķāļāđāļĄāđāļāļķāđāļāļāļąāļāļĨāļģāļāļąāļāļāļąāđāļ āļāļąāļāļāļąāđāļāđāļāđāļāļŠāļīāļāļāļīāđāđāļāļāļēāļ° (āļĄāļąāļāļĄāļĩāļ§āļąāļāļŦāļĄāļāļāļēāļĒāļļ)
- āļāļēāļĢāđāļāđāļēāļāļķāļāļāļąāđāļ§āļāļĢāļēāļ§: āļŠāļīāļāļāļīāđāļāļđāļāđāļ§āļĨāļēāļāļ§āļĢāđāļĄāđāļāļđāļāļĢāļ§āļĄāđāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļĢ
- āđāļāļĢāļāļāļēāļĢāļāđāļēāļĄāļāļĩāļĄ: āđāļŦāđāļŠāļīāļāļāļīāđāļāļēāļĄāļŠāļĄāļēāļāļīāļāđāļāļĢāļāļāļēāļĢ āđāļāļāļāļĩāđāļāļ°āļāļēāļĄāļŠāļēāļĒāļāļēāļĢāļāļąāļāļāļēāļĢ
āļāđāļēāļāļļāļāļŠāļĢāđāļēāļāļŠāļīāđāļāļāļĩāđāđāļ AppMaster closure table āļĄāļąāļāļāļąāļāļāļđāđāđāļāđāļāļĩāđāļāđāļĄāđāļāļĨāļāđāļāļĄāļđāļĨāđāļāļāļ āļēāļāđāļĨāļ°āļāļģāđāļŦāđāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāļāđāļēāļĒāļāļķāđāļāļāļąāđāļāđāļ§āđāļāđāļĨāļ°āļĄāļ·āļāļāļ·āļ
āļāđāļāđāļĨāļāđāļāļĨāļĩāđāļĒāļ: āļāļ§āļēāļĄāđāļĢāđāļ§ āļāļ§āļēāļĄāļāļąāļāļāđāļāļ āđāļĨāļ°āļāļēāļĢāļāļģāļĢāļļāļāļĢāļąāļāļĐāļē
āļāļąāļ§āđāļĨāļ·āļāļāđāļŦāļāđāļāļĩāđāļŠāļļāļāļāļ·āļāļāļļāļāļāļ°āļāļĢāļąāļāļāļĢāļļāļāļāļ°āđāļĢ: āļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļāđāļēāļĒāđāļĨāļ°āļŠāļāļĩāļĄāļēāļāļāļēāļāđāļĨāđāļ āļŦāļĢāļ·āļāļāđāļāļāļāļēāļĢāļāļēāļĢāļāđāļēāļāļāļĩāđāđāļĢāđāļ§āļŠāļģāļŦāļĢāļąāļ "āđāļāļĢāļāļĒāļđāđāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđ" āđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđ
Adjacency lists āļāļģāđāļŦāđāļāļēāļĢāļēāļāđāļĨāđāļāđāļĨāļ°āļāļēāļĢāļāļąāļāđāļāļāļāđāļēāļĒ āļāđāļāļāļļāļāļāļĢāļēāļāļāđāļāļāļąāđāļāļāđāļēāļ: subtree āļĄāļąāļāļŦāļĄāļēāļĒāļāļķāļ recursion āļāļąāđāļāļāļēāļāļĢāļąāļāđāļāđāļāđāļēāļāļāļāđāļāļĢāļāļāļāļāļļāļāđāļĨāđāļ UI āđāļŦāļĨāļāđāļāđāđāļĄāđāļāļĩāđāļĢāļ°āļāļąāļ āļŦāļĢāļ·āļāļāļīāļĨāđāļāļāļĢāđāļāļēāļĄāļĨāļģāļāļąāļāļāļąāđāļāđāļāđāđāļāđāļĄāđāļāļĩāđāļāļĩāđ
Closure tables āļāļĨāļīāļāļāļēāļĢāđāļĨāļāđāļāļĨāļĩāđāļĒāļ āļāļēāļĢāļāđāļēāļāđāļĢāđāļ§āđāļāļĢāļēāļ°āļāļļāļāļāļāļ "āļāļēāļĒāļēāļāļāļąāđāļāļŦāļĄāļ" āļāđāļ§āļĒ join āļāļāļāļī āļāļēāļĢāđāļāļĩāļĒāļāļāļąāļāļāđāļāļāļāļķāđāļāđāļāļĢāļēāļ°āļāļēāļĢāļĒāđāļēāļĒāļŦāļĢāļ·āļāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļēāļāļāđāļāļāđāļāļĢāļāđāļĨāļ°āļĨāļāļŦāļĨāļēāļĒāđāļāļ§
āđāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāļīāļ āļāļēāļĢāđāļĨāļāđāļāļĨāļĩāđāļĒāļāļĄāļąāļāđāļāđāļāļāļąāļāļāļĩāđ:
- āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāļāđāļēāļ: adjacency āļāđāļāļ recursion; closure āļŠāđāļ§āļāđāļŦāļāđāđāļāđāļ join āđāļĨāļ°āļĒāļąāļāđāļĢāđāļ§āđāļĄāļ·āđāļāļāļāļāđāļāļĢāđāļāļāļķāđāļ
- āļāļ§āļēāļĄāļāļąāļāļāđāļāļāļāļēāļĢāđāļāļĩāļĒāļ: adjacency āļāļąāļāđāļāļ
parent_idāđāļāļĩāļĒāļ§; closure āļāļąāļāđāļāļāļŦāļĨāļēāļĒāđāļāļ§āđāļĄāļ·āđāļāļĒāđāļēāļĒ - āļāļāļēāļāļāđāļāļĄāļđāļĨ: adjacency āđāļāļāļēāļĄāļāļ/āļāļĩāļĄ; closure āđāļāļāļēāļĄāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđ (āđāļāļāļĢāļāļĩāđāļĒāđ āđ āļāļĢāļ°āļĄāļēāļ N^2 āļŠāļģāļŦāļĢāļąāļāļāđāļāđāļĄāđāļĨāļķāļ)
āļāļēāļĢāļāļģāļāļąāļāļāļĩāļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāļāļąāđāļāļŠāļāļāđāļāļ āđāļāđāđāļāđāļēāļŦāļĄāļēāļĒāļāđāļēāļāļāļąāļ:
- Adjacency list: āļāļģāļāļąāļāļāļĩ pointer āļāđāļāđāļĄāđ (
manager_id) āļĢāļ§āļĄāļāļķāļāļāļīāļĨāđāļāļāļĢāđāļāļĩāđāđāļāđāļāđāļāļĒāđāļāđāļāļāļ "active" - Closure table: āļāļģāļāļąāļāļāļĩ
(ancestor_id, descendant_id)āđāļĨāļ°descendant_idāđāļāļĩāđāļĒāļ§āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāđāļāļŦāļēāļāļĩāđāđāļāđāļāđāļāļĒ
āļāļāļāđāļēāļĒ āđ: āļāđāļēāļāļļāļāđāļĄāđāļāđāļāļĒāļāļĢāļāļāļāļēāļĄāļĨāļģāļāļąāļāļāļąāđāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđāđāļāđāļāđāļāđ "āļāļđāđāļāļąāļāļāļēāļĢāđāļŦāđāļāļāļđāđāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļ" adjacency list āļĄāļąāļāđāļāļĩāļĒāļāļāļ āļŦāļēāļāļāļļāļāļĄāļąāļāļĢāļąāļāļĢāļēāļĒāļāļēāļ "āļāļļāļāļāļāđāļāđ VP X" āļāļĢāļāļāļāļēāļĄāļāđāļāđāļĄāđāđāļāļāļ āļŦāļĢāļ·āļāļāļąāļāļāļąāļāļŠāļīāļāļāļīāđāļāļēāļĄāļĨāļģāļāļąāļāļāļąāđāļāđāļāļŦāļĨāļēāļĒāļŦāļāđāļēāļāļ closure table āļĄāļąāļāļāļļāđāļĄāļāđāļēāļāļąāļāļāļēāļĢāļāļģāļĢāļļāļāļĢāļąāļāļĐāļēāđāļāļīāđāļĄāđāļāļīāļĄ
āļāļąāđāļāļāļāļ: āļĒāđāļēāļĒāļāļēāļ adjacency list āđāļ closure table
āļāļļāļāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāđāļĨāļ·āļāļāđāļāļāđāļāļ§āļąāļāđāļĢāļ āđāļŠāđāļāļāļēāļāļāļĨāļāļāļ āļąāļĒāļāļ·āļāđāļāđāļ adjacency list (manager_id āļŦāļĢāļ·āļ parent_id) āđāļĨāļ°āđāļāļīāđāļĄ closure table āđāļāļĩāļĒāļāļāđāļēāļ āļāļēāļāļāļąāđāļāļĒāđāļēāļĒāļāļēāļĢāļāđāļēāļāļāļĩāļĨāļ°āļāļļāļ āđāļāļ·āđāļāļĨāļāļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāļāļāļ°āļāļĢāļ§āļāļŠāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāđāļŦāļĄāđāđāļāļāļēāļĢāļāļīāļ§āļĢāļĩāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđ
āđāļĢāļīāđāļĄāļāđāļ§āļĒāļāļēāļĢāļŠāļĢāđāļēāļ closure table (āļĄāļąāļāļāļ·āđāļ org_closure) āļĄāļĩāļāļāļĨāļąāļĄāļāđāļāļĒāđāļēāļ ancestor_id, descendant_id, āđāļĨāļ° depth āđāļĒāļāļāļēāļāļāļēāļĢāļēāļ employees āļŦāļĢāļ·āļ teams āđāļāļīāļĄāđāļāļ·āđāļāđāļŦāđāļāļļāļ backfill āđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāđāļāđāđāļāļĒāđāļĄāđāđāļāļ°āļāļĩāđāļāļāļĢāđāļāļąāļāļāļļāļāļąāļ
āļāļēāļĢāđāļāļīāļāđāļāđāļāļēāļāļāļąāđāļāļāļāļīāļāļąāļāļī:
- āļŠāļĢāđāļēāļ closure table āđāļĨāļ°āļāļąāļāļāļĩāđāļāļāļāļ°āļāļĩāđāļĒāļąāļāļāļāđāļāđāļ adjacency list āđāļāđāļāđāļŦāļĨāđāļāļāļ§āļēāļĄāļāļĢāļīāļ
- backfill āđāļāļ§ closure āļāļēāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļāļđāđāļāļąāļāļāļēāļĢāļāļąāļāļāļļāļāļąāļ āļĢāļ§āļĄāļāļąāđāļāđāļāļ§āļāļąāļ§āđāļāļ (āđāļāđāļĨāļ°āđāļŦāļāļāđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļąāļ§āđāļāļāļāļĩāđ depth 0)
- āļāļĢāļ§āļāļŠāļāļāļāđāļ§āļĒ spot checks: āđāļĨāļ·āļāļāļāļđāđāļāļąāļāļāļēāļĢāđāļĄāđāļāļĩāđāļāļāđāļĨāļ°āļĒāļ·āļāļĒāļąāļāļ§āđāļēāļāļļāļāļāļđāđāđāļāđāļāļąāļāļāļąāļāļāļąāļāļāļēāļāļĢāļāļāļąāđāļāļŠāļāļāđāļāļ
- āļĒāđāļēāļĒāđāļŠāđāļāļāļēāļāļāļēāļĢāļāđāļēāļāļāđāļāļ: āļĢāļēāļĒāļāļēāļ āļāļąāļ§āļāļĢāļāļ āđāļĨāļ°āļŠāļīāļāļāļīāđāļĨāļģāļāļąāļāļāļąāđāļāļāđāļēāļāļāļēāļ closure table āļāđāļāļāļāļĩāđāļāļ°āđāļāļĨāļĩāđāļĒāļāļāļēāļĢāđāļāļĩāļĒāļ
- āļāļāļĒāļāļąāļāđāļāļ closure āđāļāļāļļāļāļāļēāļĢāđāļāļĩāļĒāļ (re-parent, hire, move team) āđāļĄāļ·āđāļāđāļŠāļāļĩāļĒāļĢāđāļĨāđāļ§ āđāļĨāļīāļāđāļāđāļāļīāļ§āļĢāļĩāđāļāļ recursive
āđāļĄāļ·āđāļāļĒāļ·āļāļĒāļąāļ āđāļŦāđāđāļāđāļāļāļĢāļāļĩāļāļĩāđāļĄāļąāļāļāļģāđāļŦāđāļŠāļīāļāļāļīāđāļāļīāļ: āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢ āļāļđāđāļāļģāļĢāļ°āļāļąāļāļāļāļŠāļļāļ āđāļĨāļ°āļāļđāđāđāļāđāļāļĩāđāđāļĄāđāļĄāļĩāļāļđāđāļāļąāļāļāļēāļĢ
āļāđāļēāļāļļāļāļŠāļĢāđāļēāļāđāļ AppMaster āļāļļāļāļŠāļēāļĄāļēāļĢāļāđāļŦāđ endpoint āđāļāđāļēāđāļāđāļāļēāļāđāļāļāđāļāļāļāļāļ°āļāļĩāđāđāļāļīāđāļĄ endpoint āđāļŦāļĄāđāļāļĩāđāļāđāļēāļāļāļēāļ closure table āđāļĨāđāļ§āļŠāļĨāļąāļāļāļąāļāļāļĩāđāļĄāļ·āđāļāļāļĨāļāļĢāļāļāļąāļ
āļāđāļāļāļīāļāļāļĨāļēāļāļāļąāđāļ§āđāļāļāļĩāđāļāļģāđāļŦāđāļāļēāļĢāļāļĢāļāļāļŦāļĢāļ·āļāļŠāļīāļāļāļīāđāļāļąāļ
āļ§āļīāļāļĩāļāļĩāđāđāļĢāđāļ§āļāļĩāđāļŠāļļāļāļāļĩāđāļāļ°āļāļģāļĨāļēāļĒāļāļĩāđāļāļāļĢāđāļāļāļāđāļāļĢāļāļ·āļāļāļĨāđāļāļĒāđāļŦāđāļĨāļģāļāļąāļāļāļąāđāļāđāļĄāđāļŠāļāļāļāļĨāđāļāļ āļāđāļāļĄāļđāļĨāļāļēāļāļāļđāđāļāđāļāļāļĩāļĨāļ°āđāļāļ§ āđāļāđāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāđāļĨāđāļ āđ āļŠāļēāļĄāļēāļĢāļāļāļģāđāļŦāđāļāļąāļ§āļāļĢāļāļāļāļīāļ āļŦāļāđāļēāđāļŦāļĨāļāļāđāļē āļŦāļĢāļ·āļāļāļēāļĢāļĢāļąāđāļ§āļāļāļāļŠāļīāļāļāļīāđ
āļāļąāļāļŦāļēāļāļĨāļēāļŠāļŠāļīāļāļāļ·āļāļŠāļĢāđāļēāļāļ§āļāļāļĢāđāļāļĒāđāļĄāđāļāļąāđāļāđāļ: A āđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļāļāļ B āđāļĨāļ°āļāđāļāļĄāļēāļĄāļĩāđāļāļĢāļŠāļąāļāļāļāļāļąāđāļ B āđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļāļāļ A (āļŦāļĢāļ·āļāļ§āļāļāļĢāļĒāļēāļ§āļāđāļēāļ 3-4 āļāļ) āļāļīāļ§āļĢāļĩāđāļāļ recursive āļāļēāļāļ§āļīāđāļāđāļĄāđāļĢāļđāđāļāļ āļāļ·āļāđāļāļ§āļāđāļģ āļŦāļĢāļ·āļāļāļĢāļāđāļ§āļĨāļēāļāļāļ āļŠāļīāđāļāļāļĩāđāļāļ°āđāļāļīāļāļāļķāđāļāđāļāđāđāļĄāđāļāļąāļ closure table āļāđāļŠāļēāļĄāļēāļĢāļāļāļāđāļāļ·āđāļāļāđāļāļ§āļāļĢāļĢāļāļāļļāļĢāļļāļĐ/āļāļēāļĒāļēāļāđāļāđ
āļāļąāļāļŦāļēāļāļąāđāļ§āđāļāļāļĩāļāļāļĒāđāļēāļāļāļ·āļ drift āļāļāļ closure: āļāļļāļāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢāļāļāļāđāļāļĢāļŠāļąāļāļāļ āđāļāđāđāļāđāđāļāļĨāļĩāđāļĒāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāđāļāļĒāļāļĢāļāđāļĨāđāļ§āļĨāļ·āļĄ rebuild āđāļāļ§ closure āļŠāļģāļŦāļĢāļąāļ subtree āļāļąāđāļ āļāđāļāļĄāļēāļāļīāļĨāđāļāļāļĢāđāđāļāđāļ "āļāļļāļāļāļāđāļāđ VP āļāļĩāđ" āļāļ°āļāļ·āļāļāļĨāļāļŠāļĄāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāđāļēāđāļĨāļ°āđāļŦāļĄāđ āļĄāļąāļāļĒāļēāļāļāļ°āļŠāļąāļāđāļāļāđāļāļĢāļēāļ°āļŦāļāđāļēāđāļāļĢāđāļāļĨāđāđāļāđāļĨāļ°āļāļāļĒāļąāļāļāļđāļāļđāļāļāđāļāļ
āļāļąāļāļāļāļāđāļāļĢāļĒāļąāļāļĒāļļāđāļāđāļĄāļ·āđāļāđāļāļāļāđāļĨāļ°āđāļŠāđāļāļāļēāļĢāļĢāļēāļĒāļāļēāļāļāļŠāļĄāļāļąāļāđāļāļĒāđāļĄāđāļĄāļĩāļāđāļāļāļģāļŦāļāļāļāļąāļāđāļāļ āđāļāļāļāļĄāļąāļāđāļāđāļāļāļēāļĢāļāļąāļāļāļĨāļļāđāļĄāļāļĢāļīāļŦāļēāļĢ āđāļāļāļāļ°āļāļĩāđāđāļŠāđāļāļāļēāļĢāļĢāļēāļĒāļāļēāļāđāļāļĩāđāļĒāļ§āļāļąāļāļāļđāđāļāļąāļāļāļēāļĢ āļāđāļēāļāļļāļāļāļģāđāļŦāđāļŠāļāļāļāļĒāđāļēāļāļāļĩāđāđāļāđāļāļāđāļāđāļĄāđāđāļāļĩāļĒāļ§āļāļąāļ āļāļļāļāļāļēāļāđāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāđāļāļĨāļ āđ āđāļāđāļ "āļāļēāļĢāļĒāđāļēāļĒāđāļāļāļ" āļāļģāđāļŦāđāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļĨāļĩāđāļĒāļāđāļāļĒāđāļĄāđāļāļąāđāļāđāļ
āļŠāļīāļāļāļīāđāļāļąāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļĄāļ·āđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļĄāļāļāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ āļŦāļēāļāļāļļāļāļāļāļļāļāļēāļāđāļĄāļ·āđāļ viewer is manager of employee āļāļļāļāļāļ°āļāļĨāļēāļāļŠāļēāļĒāļāļąāļāļāļąāļāļāļąāļāļāļēāļāļąāđāļāļŦāļĄāļ āļāļĨāļāļ·āļāļāļĨāđāļāļāļĄāļēāļāđāļāļīāļāđāļ (āļāļđāđāļāļąāļāļāļēāļĢāļāđāļēāļĄāļāļąāđāļāđāļĄāđāđāļŦāđāļāļāļāļāđāļāļĢāļāļāļāļāļ) āļŦāļĢāļ·āļāđāļāļĢāđāļĄāļēāļāđāļāļīāļāđāļ (āđāļāļĢāļāļēāļāļāļāđāļāđāļŠāļīāļāļāļīāđāđāļāļĢāļēāļ°āļāļđāļāļāļąāđāļāđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļāļāļąāđāļ§āļāļĢāļēāļ§)
āļŦāļāđāļēāļĢāļēāļĒāļāļēāļĢāļāļĩāđāļāđāļēāļāđāļāļĒāļĄāļēāļāļēāļāļāļēāļĢāļĢāļąāļāļāļēāļĢāļāļĢāļāļāđāļāļ recursive āđāļāļāļļāļāļāļģāļāļ (āļāļļāļ inbox āļāļļāļāļĢāļēāļĒāļāļēāļĢ ticket āļāļļāļāļāļēāļĢāļāđāļāļŦāļēāļāļāļąāļāļāļēāļ) āļŦāļēāļāļāļīāļĨāđāļāļāļĢāđāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļāļļāļāļāļĩāđ āļāļļāļāļāļ§āļĢāļĄāļĩāđāļŠāđāļāļāļēāļ precomputed (closure table) āļŦāļĢāļ·āļāļāļļāļ ID āļāļāļąāļāļāļēāļāļāļĩāđāļāļāļļāļāļēāļāđāļāļāđāļāļ
āļāļēāļĢāļāđāļāļāļāļąāļāļāļāļīāļāļąāļāļīāļāļĩāđāđāļāļ°āļāļģ:
- āļāļĨāđāļāļāļ§āļāļāļĢāļāđāļ§āļĒāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļāļāļāļąāļāļāļķāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢ
- āļāļąāļāļŠāļīāļāđāļāļ§āđāļē "āđāļāļāļ" āļŦāļĄāļēāļĒāļāļķāļāļāļ°āđāļĢ āđāļĨāļ°āđāļĒāļāļĄāļąāļāļāļēāļāđāļŠāđāļāļāļēāļĢāļĢāļēāļĒāļāļēāļ
- āļāđāļēāđāļāđ closure table āđāļŦāđ rebuild āđāļāļ§āļāļēāļĒāļēāļāđāļĄāļ·āđāļāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢ
- āđāļāļĩāļĒāļāļāļāļŠāļīāļāļāļīāđāļŠāļģāļŦāļĢāļąāļāļŠāļēāļĒāļāļąāđāļāļŦāļĄāļ āđāļĄāđāđāļāđāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāļāļĢāļ
- āļāļģāļāļ§āļāļāļāļāđāļāļāļāļāļāđāļāļĢāļāļĩāđāđāļāđāđāļāļŦāļāđāļē list āļĨāđāļ§āļāļŦāļāđāļē āđāļāļāļāļĩāđāļāļ°āļāļģāļāļ§āļ recursion āļāļļāļāļāļĢāļąāđāļ
āļāđāļēāļāļļāļāļŠāļĢāđāļēāļāđāļāļāđāļāļāļĄāļīāļāđāļ AppMaster āđāļŦāđāļāļ·āļāļ§āđāļē "āđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢ" āđāļāđāļ workflow āļāļĩāđāļāđāļāļāļĢāļ°āļ§āļąāļ: āļāļĢāļ§āļāļŠāļāļ āļĄāļāļāļāļĨāļāļĢāļ°āļāļāļāđāļāļāđāļāļĄāļđāļĨāļĨāļģāļāļąāļāļāļąāđāļ āđāļĨāđāļ§āļāļĨāđāļāļĒāđāļŦāđāļāļĢāļ°āļāļāļāļąāļ§āļāļĢāļāļāđāļĨāļ°āļāļēāļĢāđāļāđāļēāļāļķāļāđāļāđāđāļĄāļ·āđāļāļāļļāļāļāļĒāđāļēāļāļāđāļēāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ
āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļ§āļāļāđāļāļāļāļĨāđāļāļĒ
āļāđāļāļāđāļĢāļĩāļĒāļāļāļąāļāļāļāļāđāļāļĢāļ§āđāļē "āđāļŠāļĢāđāļ" āđāļŦāđāđāļāđāđāļāļ§āđāļēāļāļļāļāļāļāļīāļāļēāļĒāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāđāļāļ āļēāļĐāļēāļāđāļēāļĒ āđ āđāļāđ āļŦāļēāļāđāļāļĢāļāļēāļĄāļ§āđāļē "āđāļāļĢāđāļŦāđāļāļāļāļąāļāļāļēāļ X āđāļĨāļ°āļāļģāđāļĄ?" āļāļļāļāļāļ§āļĢāļāļĩāđāđāļāļĒāļąāļāļāļāđāļāļĩāļĒāļ§āđāļĨāļ°āļāļīāļ§āļĢāļĩ (āļŦāļĢāļ·āļāļ§āļīāļ§) āđāļāļĩāļĒāļ§āļāļĩāđāļāļīāļŠāļđāļāļāđāđāļāđ
āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļąāļāļĄāļē āļāļąāļ adjacency list "āđāļŠāļāļāļāļļāļāļāļāđāļāđāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđ" āļāļĨāļēāļĒāđāļāđāļāļāļīāļ§āļĢāļĩ recursive āļāļĩāđāļāļ§āļēāļĄāđāļĢāđāļ§āļāļķāđāļāļāļąāļāļāļ§āļēāļĄāļĨāļķāļāđāļĨāļ°āļāļēāļĢāļāļģāļāļąāļāļāļĩ āļāļąāļ closure table āļāļēāļĢāļāđāļēāļāļĄāļąāļāđāļĢāđāļ§ āđāļāđāļāļļāļāļāđāļāļāđāļāļ·āđāļāđāļŠāđāļāļāļēāļāļāļēāļĢāđāļāļĩāļĒāļāļ§āđāļēāļāļ°āļĢāļąāļāļĐāļēāļāļēāļĢāļēāļāđāļŦāđāļāļđāļāļāđāļāļāļŦāļĨāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļļāļāļāļĢāļąāđāļ
āļĢāļēāļĒāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļąāđāļ āđ āļāđāļāļāļāļĨāđāļāļĒ:
- āđāļĨāļ·āļāļāļāļāļąāļāļāļēāļāļāļāļŦāļāļķāđāļāđāļĨāļ°āļāļēāļĄāļŠāļīāļāļāļīāđāļāļēāļāļāđāļāļāļāļāļ: āļŠāļēāļĒāđāļŦāļāđāļŦāđāļŠāļīāļāļāļīāđ āđāļĨāļ°āļāļāļāļēāļāđāļāļāļāļīāđāļŠāļ
- āļāļāļŠāļāļ benchmark āļāļīāļ§āļĢāļĩ subtree āļāļāļāļāļđāđāļāļąāļāļāļēāļĢāđāļāļĒāđāļāđāļāļāļēāļāļāļēāļāļŦāļ§āļąāļ (āđāļāđāļ 5 āļĢāļ°āļāļąāļāļĨāļķāļāđāļĨāļ° 50,000 āļāļāļąāļāļāļēāļ)
- āļāļĨāđāļāļāļāļēāļĢāđāļāļĩāļĒāļāļāļĩāđāļāļīāļ: āļāđāļāļāļāļąāļāļ§āļāļāļĢ āļāļēāļĢāđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļāļąāļ§āđāļāļ āđāļĨāļ°āđāļŦāļāļāđāļĢāđāļāđāļāđāļĄāđāļāđāļ§āļĒāļāđāļāļāļģāļāļąāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļ āļēāļĒāđāļ transaction
- āļāļāļŠāļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļ: āļĒāđāļēāļĒ āļāļŠāļēāļ āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļąāļāļāļēāļĢ āđāļĨāļ° rollback āđāļĄāļ·āđāļāļāļēāļāļāļĒāđāļēāļāļĨāđāļĄāđāļŦāļĨāļ§āļāļķāđāļāļāļĨāļēāļ
- āđāļāļīāđāļĄāļāļēāļĢāļāļāļŠāļāļāļŠāļīāļāļāļīāđāļāļĩāđāļĒāļ·āļāļĒāļąāļāļāļąāđāļāļāļēāļĢāļāļāļļāļāļēāļāđāļĨāļ°āļāļēāļĢāļāļāļīāđāļŠāļāļŠāļģāļŦāļĢāļąāļāļāļāļāļēāļāļāļĢāļīāļ (HR, āļāļđāđāļāļąāļāļāļēāļĢ, āļŦāļąāļ§āļŦāļāđāļēāļāļĩāļĄ, āļāđāļēāļĒāļŠāļāļąāļāļŠāļāļļāļ)
āļŠāļāļēāļāļāļēāļĢāļāđāļāļāļīāļāļąāļāļīāļāļĩāđāļāđāļāļāļāļĢāļ§āļāļŠāļāļ: āđāļāđāļēāļŦāļāđāļēāļāļĩāđāļāļąāļāļāļāļĢāđāļāļāļđāđāļāđāđāļāļāļēāļ°āļāļāļąāļāļāļēāļāđāļāđāļāļāļāļāļĩāđāđāļāđāļĢāļąāļāļĄāļāļāļŦāļĄāļēāļĒ āđāļāļāļāļ°āļāļĩāđāļāļđāđāļāļąāļāļāļēāļĢāļāļđ subtree āļāļąāđāļāļŦāļĄāļāļāļāļāļāļ āļŦāļēāļāļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļĨāļāļāļāļąāļāļāļāļāđāļāļĢāđāļ PostgreSQL āđāļĨāļ°āļāļīāļŠāļđāļāļāđāļāļāļāļąāđāļāļŠāļāļāļāđāļ§āļĒāļāļēāļĢāļāļāļŠāļāļ āļāļļāļāļāđāđāļāļĨāđāļāļ°āļāļĨāđāļāļĒāđāļĨāđāļ§
āļāđāļēāļāļļāļāļŠāļĢāđāļēāļāđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļ āļēāļĒāđāļāđāļ AppMaster āđāļāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļŦāļĨāđāļēāļāļĩāđāđāļāđāļāļāļēāļĢāļāļāļŠāļāļāļāļąāļāđāļāļĄāļąāļāļīāļĢāļāļ endpoint āļāļĩāđāļāļ·āļāļĢāļēāļĒāļāļēāļĢāļāļāļāđāļāļĢāđāļĨāļ°āđāļāļĢāđāļāļĨāđāļāļāļąāļāļāļēāļ āđāļĄāđāđāļāđāđāļāđāļāļīāļ§āļĢāļĩāļāļēāļāļāđāļāļĄāļđāļĨ
āļŠāļāļēāļāļāļēāļĢāļāđāļāļąāļ§āļāļĒāđāļēāļāđāļĨāļ°āļāļąāđāļāļāļāļāļāđāļāđāļ
āļĨāļāļāļāļķāļāļāļķāļāļāļĢāļīāļĐāļąāļāļāļĩāđāļĄāļĩāļŠāļēāļĄāđāļāļāļ: Sales, Support āđāļĨāļ° Engineering āđāļāđāļĨāļ°āđāļāļāļāļĄāļĩāļŠāļāļāļāļĩāļĄ āđāļĨāļ°āđāļāđāļĨāļ°āļāļĩāļĄāļĄāļĩāļŦāļąāļ§āļŦāļāđāļē Sales Lead A āļāļāļļāļĄāļąāļāļīāļŠāđāļ§āļāļĨāļāļŠāļģāļŦāļĢāļąāļāļāļĩāļĄāļāļāļāļāļ Support Lead B āļāļđāļāļąāđāļ§āļāļąāđāļāļŦāļĄāļāđāļāđāļāļāļāļāļāļāļāļ āđāļĨāļ° VP of Engineering āļāļđāļāļļāļāļāļĒāđāļēāļāđāļ Engineering
āļāļēāļāļāļąāđāļāđāļāļīāļāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļ: āļāļĩāļĄ Support āļŦāļāļķāđāļāļāļĩāļĄāļĒāđāļēāļĒāđāļāļāļĒāļđāđāđāļāđ Sales āđāļĨāļ°āđāļāļīāđāļĄāļāļđāđāļāļąāļāļāļēāļĢāļāļāđāļŦāļĄāđāļĢāļ°āļŦāļ§āđāļēāļāļāļđāđāļāļģāļāļ§āļĒāļāļēāļĢāļāđāļēāļĒāļāļēāļĒāļāļąāļāļŦāļąāļ§āļŦāļāđāļēāļāļĩāļĄāļŠāļāļāļāļ āđāļāļ§āļąāļāļāļąāļāļĄāļē āļĄāļĩāļāļģāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāļ§āđāļē: "āđāļŦāđ Jamie (āļāļąāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđāļāđāļēāļĒāļāļēāļĒ) āļāļđāļāļąāļāļāļĩāļĨāļđāļāļāđāļēāļāļąāđāļāļŦāļĄāļāļāļāļāđāļāļāļ Sales āđāļāđāđāļĄāđāđāļāđ Engineering"
āļāđāļēāļāļļāļāđāļĄāđāļāļĨāļāļąāļāļāļāļāđāļāļĢāđāļ PostgreSQL āļāđāļ§āļĒ adjacency list āļŠāļāļĩāļĄāļēāļāļ°āđāļĢāļĩāļĒāļāļāđāļēāļĒ āđāļāđāļāļēāļāļāļāļāđāļāļāļāļ°āļĒāđāļēāļĒāđāļāļāļĩāđāļāļīāļ§āļĢāļĩāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđ āļāļīāļĨāđāļāļāļĢāđāđāļāđāļ "āļāļļāļāļāļāđāļāđ Sales" āļĄāļąāļāļāđāļāļ recursion āđāļĄāļ·āđāļāļāļļāļāđāļāļīāđāļĄāļāļēāļĢāļāļāļļāļĄāļąāļāļī (āđāļāđāļ "āđāļāļāļēāļ°āļāļđāđāļāļąāļāļāļēāļĢāđāļāļŠāļēāļĒāđāļāđāļēāļāļąāđāļāļāļĩāđāļāļāļļāļĄāļąāļāļīāđāļāđ") āļāļāļāđāļāļāļŦāļĨāļąāļāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ°āđāļĢāļīāđāļĄāļĄāļĩāļāļĨ
āļāļąāļ closure table āļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļāļāļāļēāļāđāļāļĩāļĒāļāļĄāļēāļāļāļķāđāļ (āļāļąāļāđāļāļāđāļāļ§āļāļĢāļĢāļāļāļļāļĢāļļāļĐ/āļāļēāļĒāļēāļ) āđāļāđāļāļąāđāļāļāđāļēāļāļāļ°āļāļĢāļāđāļāļāļĢāļāļĄāļē āļāļīāļĨāđāļāļāļĢāđāđāļĨāļ°āļŠāļīāļāļāļīāđāļĄāļąāļāđāļāđāļ join āļāđāļēāļĒ āđ: "āļāļđāđāđāļāđāđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļāļąāļāļāļēāļāļāļāļāļąāđāļāļŦāļĢāļ·āļāđāļĄāđ?" āļŦāļĢāļ·āļ "āļāļĩāļĄāļāļĩāđāļāļĒāļđāđāđāļ subtree āđāļāļāļāļāļĩāđāļŦāļĢāļ·āļāđāļĄāđ?"
āļŠāļīāđāļāļāļĩāđāļŠāļ°āļāđāļāļāđāļāļĒāļāļĢāļāđāļāļŦāļāđāļēāļāļāļāļĩāđāļāļāļŠāļĢāđāļēāļ: āļāļąāļ§āđāļĨāļ·āļāļāļāļāļāļĩāđāļāļĢāļāļāļāļēāļĄāđāļāļāļ āļāļēāļĢāļāļģāļŦāļāļāđāļŠāđāļāļāļēāļāļāļēāļĢāļāļāļļāļĄāļąāļāļīāđāļāļĒāļąāļāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđāđāļāļĨāđāļāļĩāđāļŠāļļāļāđāļŦāļāļ·āļāļāļđāđāļāļ āļĢāļēāļĒāļāļēāļāļāļđāđāļāļđāđāļĨāļŠāļģāļŦāļĢāļąāļāđāļāļāļāļāļĢāđāļāđāļāļāļ āđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļĩāđāļāļāļīāļāļēāļĒāļ§āđāļēāļāļģāđāļĄāļāļēāļĢāđāļāđāļēāļāļķāļāļāļķāļāļĄāļĩāļāļĒāļđāđāđāļāļ§āļąāļāļāļĩāđāļāļģāļŦāļāļ
āļāļąāđāļāļāļāļāļāđāļāđāļ:
- āđāļāļĩāļĒāļāļāļāļŠāļīāļāļāļīāđāđāļāđāļāļ āļēāļĐāļēāļāđāļēāļĒ āđ (āđāļāļĢāđāļŦāđāļāļāļ°āđāļĢ āđāļĨāļ°āļāļģāđāļĄ)
- āđāļĨāļ·āļāļāđāļĄāđāļāļĨāļāļĩāđāļāļĢāļāļāļąāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļ (āļāđāļēāļāđāļĢāđāļ§ vs āđāļāļĩāļĒāļāļāđāļēāļĒ)
- āļŠāļĢāđāļēāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāđāļāļāļĄāļīāļāļ āļēāļĒāđāļāļāļĩāđāļāļāļŠāļāļāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļ āļāļģāļāļāđāļāđāļēāļāļķāļ āđāļĨāļ°āļāļēāļĢāļāļāļļāļĄāļąāļāļīāđāļāļāļāļĢāļāļ§āļāļāļĢ
āļāđāļēāļāļļāļāļāđāļāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāđāļāļāļĄāļīāļāđāļĨāļ°āļāļāļĢāđāļāļąāļĨāļāļĩāđāļāļĢāļ°āļŦāļāļąāļāļāļķāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāđāļāļĢāđāļāđāđāļĢāđāļ§ AppMaster (appmaster.io) āļāļēāļāđāļŦāļĄāļēāļ°: āļĄāļąāļāđāļŦāđāļāļļāļāđāļĄāđāļāļĨāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāđ PostgreSQL āļĨāļāļĄāļ·āļāļāļģāļāļĢāļĢāļāļ°āļāļēāļĢāļāļāļļāļĄāļąāļāļīāđāļāļāļ āļēāļ āđāļĨāļ°āļŠāđāļāļĄāļāļāđāļ§āđāļāđāļĨāļ°āđāļāļāļĄāļ·āļāļāļ·āļāļāļēāļ backend āđāļāļĩāļĒāļ§āļāļąāļ
āļāļģāļāļēāļĄāļāļĩāđāļāļāļāđāļāļĒ
āđāļāđ adjacency list āđāļĄāļ·āđāļāļāļāļāđāļāļĢāļāļāļāļāļļāļāđāļĨāđāļ āļāļēāļĢāļāļąāļāđāļāļāđāļāļīāļāļāđāļāļĒ āđāļĨāļ°āļŦāļāđāļēāļŠāđāļ§āļāđāļŦāļāđāļāđāļāļāļāļēāļĢāđāļāđāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļāļŦāļĢāļ·āļāļĢāļ°āļāļąāļāđāļĄāđāļāļĩāđāļāļąāđāļ āđāļāđ closure table āđāļĄāļ·āđāļāļāļļāļāļāđāļāļāļāļēāļĢāļāđāļāļĒ āđ āļāļĩāđāļāļāļĢāđāđāļāđāļ âāļāļļāļāļāļāđāļāđāļŦāļąāļ§āļŦāļāđāļēāļāļāļāļĩāđâ āļāļĢāļāļāļāļēāļĄāđāļāļāļ āļŦāļĢāļ·āļāļŠāļīāļāļāļīāđāļāļĩāđāļāļīāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļŦāļĨāļēāļĒāļŦāļāđāļēāļāļ āđāļāļĢāļēāļ°āļāļēāļĢāļāđāļēāļāļāļ°āļāļĨāļēāļĒāđāļāđāļāļāļēāļĢ join āļāļĢāļĢāļĄāļāļēāđāļĨāļ°āļāļāļāļĩāđāđāļĄāļ·āđāļāļāļĒāļēāļĒāļāļąāļ§
āđāļĢāļīāđāļĄāļāđāļ§āļĒāļāļāļĨāļąāļĄāļāđ employees(manager_id) āđāļĨāđāļ§āļāļķāļāļĢāļēāļĒāļāļēāļāđāļāļĒāļāļĢāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāđāļēāļĒ āđ WHERE manager_id = ? āđāļāļīāđāļĄāļāļēāļĢāļāđāļāļŦāļēāđāļāļ recursive āļāđāļāđāļāđāļĄāļ·āđāļāļāļĩāđāļāļāļĢāđāļāļģāđāļāđāļāļāđāļāļāđāļāđāđāļŦāļĨāđāļāļāđāļāļĄāļđāļĨāļāļĢāļĢāļāļāļļāļĢāļļāļĐāđāļāđāļĄāļŦāļĢāļ·āļ subtree āļāļąāđāļāļŦāļĄāļ āđāļāđāļ āļāļēāļĢāļāļāļļāļĄāļąāļāļī āļāļąāļ§āļāļĢāļāļ âāļāļāļāđāļāļĢāļāļāļāļāļąāļâ āļŦāļĢāļ·āļāđāļāļāļāļāļĢāđāļāļāđāļēāļĄāļāļąāđāļ
āļāļĨāđāļāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāļąāļ§āđāļāļāđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļāđāļ§āļĒāđāļāļ·āđāļāļāđāļāđāļāđāļ manager_id <> id āđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļāļēāļĢāļāļąāļāđāļāļāđāļāļ·āđāļāđāļĄāđāđāļŦāđāļāļąāđāļāļāļđāđāļāļąāļāļāļēāļĢāđāļāđāļāļāļāļāļĩāđāļāļĒāļđāđāđāļ subtree āļāļāļāļāļāļąāļāļāļēāļāđāļāļ āđāļāļāļēāļāļāļāļīāļāļąāļāļī āļ§āļīāļāļĩāļāļĩāđāļāļĨāļāļāļ āļąāļĒāļāļĩāđāļŠāļļāļāļāļ·āļāđāļāđāļāļāļ§āļēāļĄāđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāđāļāļāļāļąāļāļāļķāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļđāđāļāļąāļāļāļēāļĢ āđāļāļĢāļēāļ°āļ§āļāļāļĢāđāļāļĩāļĒāļ§āļŠāļēāļĄāļēāļĢāļāļāļģāđāļŦāđāļāļēāļĢāļāđāļāļŦāļēāđāļāļ recursive āļāļąāļāđāļĨāļ°āļāļģāđāļŦāđāļāļĢāļĢāļāļ°āļŠāļīāļāļāļīāđāđāļŠāļĩāļĒāļŦāļēāļĒāđāļāđ
āļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļĩāđāļāļĩāļāļ·āļāļāļ·āļāļ§āđāļēāđāļāļāļāđāļāđāļāļāļēāļĢāļāļąāļāļāļĨāļļāđāļĄāđāļāļīāļāļāļĢāļīāļŦāļēāļĢ āđāļĨāļ°āđāļŠāđāļāļāļēāļĢāļĢāļēāļĒāļāļēāļāđāļāđāļāļāđāļāđāļĄāđāļāļāļāļāļđāđāļāļąāļāļāļēāļĢāļāļĩāđāđāļĒāļāļāđāļēāļāļŦāļēāļ āļāļąāđāļāļāđāļ§āļĒāļāđāļāļāļāļąāļāđāļĄāđāđāļŦāđāļāļēāļĢāļĒāđāļēāļĒāđāļāļāļāđāļāļĨāļĩāđāļĒāļāļāļđāđāļāļĩāđāđāļāļĢāļĢāļēāļĒāļāļēāļāļāđāļāđāļāļĒāđāļĄāđāđāļāđāļāļąāđāļāđāļ āđāļĨāļ°āļāļģāđāļŦāđāļāļēāļĢāļāļĢāļāļāđāļāđāļ âāļāļļāļāļāļāđāļ Salesâ āļāļąāļāđāļāļāđāļĄāđāđāļŠāđāļāļāļēāļĢāļĢāļēāļĒāļāļēāļāļāļ°āđāļĄāđāļāļĢāļāļāļąāļāļāļāļāđāļāļāđāļāļāļ
āđāļāļĒāļāļąāđāļ§āđāļāđāļāđāļāļāļđāđāļāļąāļāļāļēāļĢāļŦāļĨāļąāļāļāļāđāļāļ§āļāļāļąāļāļāļēāļāđāļĨāļ°āđāļāđāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāđāļāļ dotted-line āđāļĒāļāļāđāļēāļāļŦāļēāļ āđāļāđāļ āļāļēāļĢāļēāļāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļāļđāđāļāļąāļāļāļēāļĢāļĢāļāļāļŦāļĢāļ·āļāļāļēāļĢāđāļĄāļ âāļāļđāđāļāļģāļāļĩāļĄâ āļ§āļīāļāļĩāļāļĩāđāļāđāļ§āļĒāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļāļģāļĨāļēāļĒāļāļēāļĢāļāļīāļ§āļĢāļĩāļāļ·āđāļāļāļēāļāđāļāļāļāļ°āļāļĩāđāļĒāļąāļāļāļāļļāļāļēāļāļāļāļāļīāđāļĻāļĐāđāļāđāļāļāļēāļĢāđāļāđāļēāļāļķāļāļāļēāļĄāđāļāļĢāļāļāļēāļĢāļŦāļĢāļ·āļāļāļēāļĢāļĄāļāļāļāļģāļāļēāļāļāļēāļĢāļāļāļļāļĄāļąāļāļī
āļāļļāļāļāđāļāļāļĨāļāđāļŠāđāļāļāļēāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāđāļāđāļē āđ āļŠāļģāļŦāļĢāļąāļ subtree āļāļāļāļāļāļąāļāļāļēāļāļāļĩāđāļĒāđāļēāļĒāļāļāļ āđāļĨāđāļ§āđāļāļĢāļāđāļŠāđāļāļāļēāļāđāļŦāļĄāđāđāļāļĒāļāļēāļĢāļĢāļ§āļĄāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļđāđāļāļąāļāļāļēāļĢāđāļŦāļĄāđāļāļąāļāļāļļāļāđāļŦāļāļāđāļ subtree āļāļāļāļāļāļąāļāļāļēāļāļāļąāđāļ āđāļĨāļ°āļāļģāļāļ§āļ depth āđāļŦāļĄāđ āđāļŦāđāļāļģāļāļąāđāļāļŦāļĄāļāđāļ transaction āđāļāļĩāļĒāļ§āđāļāļ·āđāļāđāļĄāđāđāļŦāđāđāļāļīāļāļāļēāļĢāļāļąāļāđāļāļāļāļĢāļķāđāļāļāļĨāļēāļāļŦāļēāļāļĄāļĩāļāđāļāļāļīāļāļāļĨāļēāļāđāļāļīāļāļāļķāđāļ
āļŠāļģāļŦāļĢāļąāļ adjacency list āđāļŦāđāļāļģāļāļąāļāļāļĩāļāļĩāđ employees(manager_id) āđāļāļĢāļēāļ°āđāļāļāļāļļāļāļāļīāļ§āļĢāļĩāđāļāļĩāđāļĒāļ§āļāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļĢāļīāđāļĄāļāļēāļāļāļĢāļāļāļąāđāļ āđāļĨāļ°āđāļāļīāđāļĄāļāļąāļāļāļĩāļŠāļģāļŦāļĢāļąāļāļāļīāļĨāđāļāļāļĢāđāļāļĩāđāđāļāđāļāđāļāļĒāđāļāđāļ team_id āļŦāļĢāļ·āļ department_id āļŠāļģāļŦāļĢāļąāļ closure table āļāļąāļāļāļĩāļāļĩāđāļŠāļģāļāļąāļāļāļ·āļāļāļĩāļĒāđāļŦāļĨāļąāļ (ancestor_id, descendant_id) āđāļĨāļ°āļāļąāļāļāļĩāđāļĒāļāļāļĩāđ descendant_id āđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ âāđāļāļĢāđāļŦāđāļāđāļāļ§āļāļĩāđāđāļāđ?â āļāļģāđāļāđāđāļĢāđāļ§
āļĢāļđāļāđāļāļāļāļąāđāļ§āđāļāļāļ·āļ EXISTS āļāļ closure table: āļāļāļļāļāļēāļāđāļĄāļ·āđāļ viewer āđāļāđāļāļāļĢāļĢāļāļāļļāļĢāļļāļĐāļāļāļāļāļāļąāļāļāļēāļāđāļāđāļēāļŦāļĄāļēāļĒ āļāļĩāđāļāļģāļāļēāļāđāļāđāļāļĩāļĢāđāļ§āļĄāļāļąāļ row-level security āđāļāļĢāļēāļ°āļāļēāļāļāđāļāļĄāļđāļĨāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļąāļāļāļāđāļāđāļāļĒāđāļēāļāļŠāļāļāļāļĨāđāļāļ āđāļāļāļāļĩāđāļāļ°āđāļŦāđ API āđāļāđāļĨāļ°āļāļļāļāļāļģāļāļĢāļĢāļāļ° recursive āđāļāļĩāļĒāļ§āļāļąāļ
āđāļāđāļāļāļĢāļ°āļ§āļąāļāļīāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĒāđāļēāļāļāļąāļāđāļāļ āđāļāļĒāļāļāļāļīāļāđāļ§āļĒāļāļēāļĢāļēāļāđāļĒāļāļāļĩāđāļāļąāļāļāļķāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļđāđāļāļąāļāļāļēāļĢāļāļĢāđāļāļĄāļ§āļąāļāļāļĩāđāļĄāļĩāļāļĨ āđāļāļāļāļĩāđāļāļ°āđāļāļĩāļĒāļāļāļąāļāļāļđāđāļāļąāļāļāļēāļĢāļāļąāļāļāļļāļāļąāļāđāļĨāļ°āļāļģāđāļŦāđāļŠāļđāļāđāļŠāļĩāļĒāļāļāļĩāļ āļ§āļīāļāļĩāļāļĩāđāļāļģāđāļŦāđāļāļļāļāļāļāļāļāļģāļāļēāļĄāļ§āđāļē âāđāļāļĢāļĢāļēāļĒāļāļēāļāđāļŦāđāđāļāļĢāđāļāļ§āļąāļāļāļĩāđ Xâ āđāļāđāđāļāļĒāđāļĄāđāļāđāļāļāđāļāļē āđāļĨāļ°āļāļģāđāļŦāđāļĢāļēāļĒāļāļēāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļāļāļāļĨāđāļāļāļŦāļĨāļąāļāļāļēāļĢāļāļĢāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļ
āđāļāđāļ manager_id āđāļāđāļāđāļŦāļĨāđāļāļāļ§āļēāļĄāļāļĢāļīāļāđāļ§āđāđāļŦāļĄāļ·āļāļāđāļāļīāļĄ āļŠāļĢāđāļēāļ closure table āļāļ§āļāļāļđāđāđāļāļāļąāļāļĄāļąāļ āđāļĨāļ° backfill āđāļāļ§ closure āļāļēāļāļāđāļāđāļĄāđāļāļąāļāļāļļāļāļąāļ āļĒāđāļēāļĒāđāļŠāđāļāļāļēāļāļāļēāļĢāļāđāļēāļāļāđāļāļ (āļāļąāļ§āļāļĢāļāļ āđāļāļāļāļāļĢāđāļ āļāļēāļĢāļāļĢāļ§āļāļŠāļīāļāļāļīāđ) āđāļĨāđāļ§āđāļŦāđāļāļēāļĢāđāļāļĩāļĒāļāļāļąāļāđāļāļāļāļąāđāļāļŠāļāļāļāļĩāđ āļŦāļĨāļąāļāļāļēāļāļĒāļ·āļāļĒāļąāļāļāļĨāđāļĨāđāļ§āļāļķāļāđāļĨāļīāļāđāļāđāļāļēāļĢāļāđāļāļŦāļēāđāļāļ recursive


