12 āļ˜.āļ„. 2567·āļ­āđˆāļēāļ™ 2 āļ™āļēāļ—āļĩ

āđāļšāļšāļˆāļģāļĨāļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāđƒāļ™ PostgreSQL: adjacency lists āļāļąāļš closure

āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš adjacency list āļāļąāļš closure table āđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāļšāļ™ PostgreSQL āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļāļĢāļ­āļ‡ āļĢāļēāļĒāļ‡āļēāļ™ āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļīāļ—āļ˜āļīāđŒ

āđāļšāļšāļˆāļģāļĨāļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāđƒāļ™ PostgreSQL: adjacency lists āļāļąāļš closure

āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļœāļąāļ‡āļ­āļ‡āļ„āđŒāļāļĢāļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļš

āļœāļąāļ‡āļ­āļ‡āļ„āđŒāļāļĢāļ„āļ·āļ­āđāļœāļ™āļ—āļĩāđˆāļ§āđˆāļēāļĢāļēāļĒāļ‡āļēāļ™āđƒāļ„āļĢāđƒāļŦāđ‰āđƒāļ„āļĢ āđāļĨāļ°āļ—āļĩāļĄāļ•āđˆāļēāļ‡ āđ† āļĢāļ§āļĄāļāļąāļ™āđ€āļ›āđ‡āļ™āđāļœāļ™āļāļ­āļĒāđˆāļēāļ‡āđ„āļĢ āđ€āļĄāļ·āđˆāļ­āļ„āļļāļ“āļ­āļ­āļāđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāđƒāļ™ 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 āļĄāļąāļāļˆāļąāļšāļ„āļđāđˆāđ„āļ”āđ‰āļ”āļĩāđƒāļ™āđ‚āļĄāđ€āļ”āļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ āļēāļžāđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒāļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āļ—āļąāđ‰āļ‡āđ€āļ§āđ‡āļšāđāļĨāļ°āļĄāļ·āļ­āļ–āļ·āļ­

āļ‚āđ‰āļ­āđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™: āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āđāļĨāļ°āļāļēāļĢāļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļē

āļ›āļĢāļąāļšāđƒāļŠāđ‰āļ—āļĩāđˆāļ—āļĩāļĄāļ‚āļ­āļ‡āļ„āļļāļ“āđƒāļŠāđ‰āļ‡āļēāļ™
āļ›āļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļ—āļĩāļĄāļ‚āļ­āļ‡āļ„āļļāļ“āļšāļ™ AppMaster Cloud āļŦāļĢāļ·āļ­āļœāļđāđ‰āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ„āļĨāļēāļ§āļ”āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ
āļ›āļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™

āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđƒāļŦāļāđˆāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļ„āļļāļ“āļˆāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ­āļ°āđ„āļĢ: āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ—āļĩāđˆāļ‡āđˆāļēāļĒāđāļĨāļ°āļŠāļāļĩāļĄāļēāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ āļŦāļĢāļ·āļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļ­āđˆāļēāļ™āļ—āļĩāđˆāđ€āļĢāđ‡āļ§āļŠāļģāļŦāļĢāļąāļš "āđƒāļ„āļĢāļ­āļĒāļđāđˆāđƒāļ•āđ‰āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ™āļĩāđ‰" āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļīāļ—āļ˜āļīāđŒ

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 āđāļœāļ™āļāļ™āļĩāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆ?"

āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļŠāļ°āļ—āđ‰āļ­āļ™āđ‚āļ”āļĒāļ•āļĢāļ‡āđƒāļ™āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļ„āļ™āļŠāļĢāđ‰āļēāļ‡: āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ„āļ™āļ—āļĩāđˆāļāļĢāļ­āļ‡āļ•āļēāļĄāđāļœāļ™āļ āļāļēāļĢāļāļģāļŦāļ™āļ”āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđ„āļ›āļĒāļąāļ‡āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ—āļĩāđˆāđƒāļāļĨāđ‰āļ—āļĩāđˆāļŠāļļāļ”āđ€āļŦāļ™āļ·āļ­āļœāļđāđ‰āļ‚āļ­ āļĢāļēāļĒāļ‡āļēāļ™āļœāļđāđ‰āļ”āļđāđāļĨāļŠāļģāļŦāļĢāļąāļšāđāļ”āļŠāļšāļ­āļĢāđŒāļ”āđāļœāļ™āļ āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāļ§āđˆāļēāļ—āļģāđ„āļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ–āļķāļ‡āļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļ§āļąāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ›:

  1. āđ€āļ‚āļĩāļĒāļ™āļāļŽāļŠāļīāļ—āļ˜āļīāđŒāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ‡āđˆāļēāļĒ āđ† (āđƒāļ„āļĢāđ€āļŦāđ‡āļ™āļ­āļ°āđ„āļĢ āđāļĨāļ°āļ—āļģāđ„āļĄ)
  2. āđ€āļĨāļ·āļ­āļāđ‚āļĄāđ€āļ”āļĨāļ—āļĩāđˆāļ•āļĢāļ‡āļāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” (āļ­āđˆāļēāļ™āđ€āļĢāđ‡āļ§ vs āđ€āļ‚āļĩāļĒāļ™āļ‡āđˆāļēāļĒ)
  3. āļŠāļĢāđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļ­āļ”āļĄāļīāļ™āļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ›āļĢāļąāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ āļ„āļģāļ‚āļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āđāļĨāļ°āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđāļšāļšāļ„āļĢāļšāļ§āļ‡āļˆāļĢ

āļ–āđ‰āļēāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļœāļ‡āđāļ­āļ”āļĄāļīāļ™āđāļĨāļ°āļžāļ­āļĢāđŒāļ—āļąāļĨāļ—āļĩāđˆāļ•āļĢāļ°āļŦāļ™āļąāļāļ–āļķāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāđ„āļ”āđ‰āđ€āļĢāđ‡āļ§ AppMaster (appmaster.io) āļ­āļēāļˆāđ€āļŦāļĄāļēāļ°: āļĄāļąāļ™āđƒāļŦāđ‰āļ„āļļāļ“āđ‚āļĄāđ€āļ”āļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđƒāļŠāđ‰ PostgreSQL āļĨāļ‡āļĄāļ·āļ­āļ—āļģāļ•āļĢāļĢāļāļ°āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđāļšāļšāļ āļēāļž āđāļĨāļ°āļŠāđˆāļ‡āļĄāļ­āļšāđ€āļ§āđ‡āļšāđāļĨāļ°āđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­āļˆāļēāļ backend āđ€āļ”āļĩāļĒāļ§āļāļąāļ™

āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ

āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ—āļĩāđˆāļ„āļ§āļĢāđƒāļŠāđ‰ adjacency list āļāļąāļš closure table āļŠāļģāļŦāļĢāļąāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢ?

āđƒāļŠāđ‰ adjacency list āđ€āļĄāļ·āđˆāļ­āļ­āļ‡āļ„āđŒāļāļĢāļ‚āļ­āļ‡āļ„āļļāļ“āđ€āļĨāđ‡āļ āļāļēāļĢāļ­āļąāļžāđ€āļ”āļ•āđ€āļāļīāļ”āļšāđˆāļ­āļĒ āđāļĨāļ°āļŦāļ™āđ‰āļēāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļ„āđˆāļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ”āļĒāļ•āļĢāļ‡āļŦāļĢāļ·āļ­āļĢāļ°āļ”āļąāļšāđ„āļĄāđˆāļāļĩāđˆāļŠāļąāđ‰āļ™ āđƒāļŠāđ‰ closure table āđ€āļĄāļ·āđˆāļ­āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļšāđˆāļ­āļĒ āđ† āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđ€āļŠāđˆāļ™ â€œāļ—āļļāļāļ„āļ™āđƒāļ•āđ‰āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ„āļ™āļ™āļĩāđ‰â€ āļāļĢāļ­āļ‡āļ•āļēāļĄāđāļœāļ™āļ āļŦāļĢāļ·āļ­āļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļ­āļīāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđƒāļ™āļŦāļĨāļēāļĒāļŦāļ™āđ‰āļēāļˆāļ­ āđ€āļžāļĢāļēāļ°āļāļēāļĢāļ­āđˆāļēāļ™āļˆāļ°āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļāļēāļĢ join āļ˜āļĢāļĢāļĄāļ”āļēāđāļĨāļ°āļ„āļ‡āļ—āļĩāđˆāđ€āļĄāļ·āđˆāļ­āļ‚āļĒāļēāļĒāļ•āļąāļ§

āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļ‡āđˆāļēāļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ “āđƒāļ„āļĢāļĢāļēāļĒāļ‡āļēāļ™āđƒāļ„āļĢ” āđƒāļ™ PostgreSQL āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

āđ€āļĢāļīāđˆāļĄāļ”āđ‰āļ§āļĒāļ„āļ­āļĨāļąāļĄāļ™āđŒ employees(manager_id) āđāļĨāđ‰āļ§āļ”āļķāļ‡āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ”āļĒāļ•āļĢāļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‡āđˆāļēāļĒ āđ† WHERE manager_id = ? āđ€āļžāļīāđˆāļĄāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļšāļš recursive āļāđ‡āļ•āđˆāļ­āđ€āļĄāļ·āđˆāļ­āļŸāļĩāđ€āļˆāļ­āļĢāđŒāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđāļŦāļĨāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļĢāļĢāļžāļšāļļāļĢāļļāļĐāđ€āļ•āđ‡āļĄāļŦāļĢāļ·āļ­ subtree āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ€āļŠāđˆāļ™ āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļī āļ•āļąāļ§āļāļĢāļ­āļ‡ â€œāļ­āļ‡āļ„āđŒāļāļĢāļ‚āļ­āļ‡āļ‰āļąāļ™â€ āļŦāļĢāļ·āļ­āđāļ”āļŠāļšāļ­āļĢāđŒāļ”āļ‚āđ‰āļēāļĄāļŠāļąāđ‰āļ™

āļˆāļ°āļ›āđ‰āļ­āļ‡āļāļąāļ™āļ§āļ‡āļˆāļĢ (A āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ‚āļ­āļ‡ B āđāļĨāđ‰āļ§ B āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ‚āļ­āļ‡ A) āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

āļšāļĨāđ‡āļ­āļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđ€āļ­āļ‡āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ”āđ‰āļ§āļĒāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđ€āļŠāđˆāļ™ manager_id <> id āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ•āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāđ€āļ›āđ‡āļ™āļ„āļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ subtree āļ‚āļ­āļ‡āļžāļ™āļąāļāļ‡āļēāļ™āđ€āļ­āļ‡ āđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļī āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āđ€āļŠāđ‡āļ„āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļšāļĢāļĢāļžāļšāļļāļĢāļļāļĐāļāđˆāļ­āļ™āļšāļąāļ™āļ—āļķāļāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢ āđ€āļžāļĢāļēāļ°āļ§āļ‡āļˆāļĢāđ€āļ”āļĩāļĒāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļšāļš recursive āļžāļąāļ‡āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļ•āļĢāļĢāļāļ°āļŠāļīāļ—āļ˜āļīāđŒāđ€āļŠāļĩāļĒāļŦāļēāļĒāđ„āļ”āđ‰

āļ„āļ§āļĢāđƒāļŦāđ‰āđāļœāļ™āļāđ€āļ›āđ‡āļ™āđ‚āļŦāļ™āļ”āđƒāļ™āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļ„āļ™āļŦāļĢāļ·āļ­āđ„āļĄāđˆ?

āļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļ”āļĩāļ„āļ·āļ­āļ–āļ·āļ­āļ§āđˆāļēāđāļœāļ™āļāđ€āļ›āđ‡āļ™āļāļēāļĢāļˆāļąāļ”āļāļĨāļļāđˆāļĄāđ€āļŠāļīāļ‡āļšāļĢāļīāļŦāļēāļĢ āđāļĨāļ°āđ€āļŠāđ‰āļ™āļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļĄāđ‰āļ‚āļ­āļ‡āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļ—āļĩāđˆāđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļ āļ™āļąāđˆāļ™āļŠāđˆāļ§āļĒāļ›āđ‰āļ­āļ‡āļāļąāļ™āđ„āļĄāđˆāđƒāļŦāđ‰āļāļēāļĢāļĒāđ‰āļēāļĒāđāļœāļ™āļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāļđāđ‰āļ—āļĩāđˆāđƒāļ„āļĢāļĢāļēāļĒāļ‡āļēāļ™āļ•āđˆāļ­āđ‚āļ”āļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āđƒāļˆ āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļāļĢāļ­āļ‡āđ€āļŠāđˆāļ™ â€œāļ—āļļāļāļ„āļ™āđƒāļ™ Sales” āļŠāļąāļ”āđ€āļˆāļ™āđāļĄāđ‰āđ€āļŠāđ‰āļ™āļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™āļˆāļ°āđ„āļĄāđˆāļ•āļĢāļ‡āļāļąāļšāļ‚āļ­āļšāđ€āļ‚āļ•āđāļœāļ™āļ

āļˆāļ°āļ­āļ­āļāđāļšāļšāļ­āļ‡āļ„āđŒāļāļĢāđāļšāļšāđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ™āļĄāļĩāļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļŠāļ­āļ‡āļ„āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđ€āļāđ‡āļšāļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļŦāļĨāļąāļāļšāļ™āđāļ–āļ§āļžāļ™āļąāļāļ‡āļēāļ™āđāļĨāļ°āđ€āļāđ‡āļšāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđāļšāļš dotted-line āđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļ āđ€āļŠāđˆāļ™ āļ•āļēāļĢāļēāļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļĢāļ­āļ‡āļŦāļĢāļ·āļ­āļāļēāļĢāđāļĄāļ› â€œāļœāļđāđ‰āļ™āļģāļ—āļĩāļĄâ€ āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļŠāđˆāļ§āļĒāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāļ—āļģāļĨāļēāļĒāļāļēāļĢāļ„āļīāļ§āļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĒāļąāļ‡āļ­āļ™āļļāļāļēāļ•āļāļŽāļžāļīāđ€āļĻāļĐāđ€āļŠāđˆāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļēāļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢāļŦāļĢāļ·āļ­āļāļēāļĢāļĄāļ­āļšāļ­āļģāļ™āļēāļˆāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļī

āļ•āđ‰āļ­āļ‡āļ­āļąāļžāđ€āļ”āļ•āļ­āļ°āđ„āļĢāļšāđ‰āļēāļ‡āđƒāļ™ closure table āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢ?

āļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļĨāļšāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļšāļĢāļĢāļžāļšāļļāļĢāļļāļĐāđ€āļāđˆāļē āđ† āļŠāļģāļŦāļĢāļąāļš 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” āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ”āļē āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļĢāļēāļĒāļ‡āļēāļ™āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļŦāļĨāļąāļ‡āļāļēāļĢāļ›āļĢāļąāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡

āļˆāļ°āļĒāđ‰āļēāļĒāļˆāļēāļ adjacency list āđ„āļ›āđ€āļ›āđ‡āļ™ closure table āđ‚āļ”āļĒāđ„āļĄāđˆāļ—āļģāđƒāļŦāđ‰āđāļ­āļ›āļžāļąāļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

āđ€āļāđ‡āļš manager_id āđ€āļ›āđ‡āļ™āđāļŦāļĨāđˆāļ‡āļ„āļ§āļēāļĄāļˆāļĢāļīāļ‡āđ„āļ§āđ‰āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ”āļīāļĄ āļŠāļĢāđ‰āļēāļ‡ closure table āļ„āļ§āļšāļ„āļđāđˆāđ„āļ›āļāļąāļšāļĄāļąāļ™ āđāļĨāļ° backfill āđāļ–āļ§ closure āļˆāļēāļāļ•āđ‰āļ™āđ„āļĄāđ‰āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĒāđ‰āļēāļĒāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āļāđˆāļ­āļ™ (āļ•āļąāļ§āļāļĢāļ­āļ‡ āđāļ”āļŠāļšāļ­āļĢāđŒāļ” āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļīāļ—āļ˜āļīāđŒ) āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ­āļąāļ›āđ€āļ”āļ•āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ—āļĩāđˆ āļŦāļĨāļąāļ‡āļˆāļēāļāļĒāļ·āļ™āļĒāļąāļ™āļœāļĨāđāļĨāđ‰āļ§āļˆāļķāļ‡āđ€āļĨāļīāļāđƒāļŠāđ‰āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļšāļš recursive

āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
āļŠāļĢāđ‰āļēāļ‡āļšāļēāļ‡āļŠāļīāđˆāļ‡āļ—āļĩāđˆ āļ™āđˆāļēāļ—āļķāđˆāļ‡

āļ—āļ”āļĨāļ­āļ‡āļāļąāļš AppMaster āļ”āđ‰āļ§āļĒāđāļœāļ™āļŸāļĢāļĩ
āđ€āļĄāļ·āđˆāļ­āļ„āļļāļ“āļžāļĢāđ‰āļ­āļĄ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļāļēāļĢāļŠāļĄāļąāļ„āļĢāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđ„āļ”āđ‰

āđ€āļĢāļīāđˆāļĄ
āđāļšāļšāļˆāļģāļĨāļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāđƒāļ™ PostgreSQL: adjacency lists āļāļąāļš closure | AppMaster