12 рджрд┐рд╕ре░ 2024┬╖8 рдорд┐рдирдЯ рдкрдврд╝рдиреЗ рдореЗрдВ

PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░рдирд╛: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдмрдирд╛рдо рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓

Adjacency lists рдФрд░ closure tables рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░реЗрдВтАФрдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ, рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рдеред

PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░рдирд╛: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдмрдирд╛рдо рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓

рдПрдХ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдХреЛ рдХрд┐рд╕ рдЪреАрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рдХрд┐рд╕рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯреАрдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рд╡рд┐рднрд╛рдЧреЛрдВ рдореЗрдВ рд░реИрдк-рдЕрдк рд╣реЛрддреА рд╣реИрдВред PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХреЗрд╡рд▓ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдкрд░ manager_id рдирд╣реАрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ тАФ рдЖрдк рдЕрд╕рд▓ рдХрд╛рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ: рдСрд░реНрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ, рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдоред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдЪреАрдЬрд╝реЗрдВ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ: рдСрд░реНрдЧ рдХрд╛ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛, рд▓реЛрдЧреЛрдВ рдХреЛ рдвреВрдБрдврдирд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ "рдореЗрд░реЗ рдХреНрд╖реЗрддреНрд░" рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ред рд╡реЗ рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрдбреЗрдЯ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдВред рдЬрдм рдХреЛрдИ рдореИрдиреЗрдЬрд░ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЪрд╛рд░реНрдЯ рд╣рд░ рдЬрдЧрд╣ рдЕрдкрдбреЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдмрд┐рдирд╛ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдпрд╛ рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреЛ рддреЛрдбрд╝реЗред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдореЙрдбрд▓ рдХреБрдЫ рдмрд╛рд░-рдмрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреА рдЪреЗрди рдСрдл рдХрдорд╛рдВрдб рдХреНрдпрд╛ рд╣реИ (рд╢реАрд░реНрд╖ рддрдХ)?
  • рдЗрд╕ рдореИрдиреЗрдЬрд░ рдХреЗ рдиреАрдЪреЗ рдХреМрди рд╣реИ (рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдФрд░ рдкреВрд░рд╛ рд╕рдмрдЯреНрд░реА)?
  • рдбреИрд╢рдмреЛрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧ рдХрд┐рд╕ рддрд░рд╣ рдЯреАрдореЛрдВ рдФрд░ рд╡рд┐рднрд╛рдЧреЛрдВ рдореЗрдВ рдЧреНрд░реБрдк рд╣реЛрддреЗ рд╣реИрдВ?
  • рд░рд┐рдЗрдВрдСрд░реНрдЧ рдмрд┐рдирд╛ glitches рдХреЗ рдХреИрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ?
  • рдСрд░реНрдЧ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреМрди рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рдЖрд╕рд╛рди рдкреЗрдбрд╝ рд╕реЗ рднреА рдЬрд╝реНрдпрд╛рджрд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдЧрдарди рдЕрдХреНрд╕рд░ рдмрджрд▓рддреЗ рд╣реИрдВред рдЯреАрдореЗрдВ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдореВрд╡ рдХрд░рддреА рд╣реИрдВ, рдореИрдиреЗрдЬрд░ рдЧреНрд░реБрдк рд╕реНрд╡реИрдк рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╡реНрдпреВрдЬрд╝ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рд▓реЛрдЧ рд▓реЛрдЧреЛрдВ рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдЯреАрдо рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ, рдФрд░ рдЯреАрдореЗрдВ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреА рдорд╛рд▓рд┐рдХ рд╣реЛрддреА рд╣реИрдВред рдкрд░рдорд┐рд╢рдиреНрд╕ рдПрдХ рдФрд░ рдкрд░рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдСрд░реНрдЧ рдХрд╛ рдЖрдХрд╛рд░ рдЖрдкрдХреА рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдбрд╛рдпрдЧреНрд░рд╛рдо рдирд╣реАрдВред

рдХреБрдЫ рд╢рдмреНрдж рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ:

  • рдиреЛрдб рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рд╡реНрдпрдХреНрддрд┐, рдПрдХ рдЯреАрдо, рдпрд╛ рдПрдХ рд╡рд┐рднрд╛рдЧ)ред
  • рдкреЗрд░реЗрдВрдЯ рд╕реАрдзреЗ рдКрдкрд░ рд╕реНрдерд┐рдд рдиреЛрдб рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рдореИрдиреЗрдЬрд░, рдпрд╛ рд╡рд╣ рд╡рд┐рднрд╛рдЧ рдЬреЛ рдЯреАрдо рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ)ред
  • рдПрдирд╕реЗрд╕реНрдЯрд░ рдХреЛрдИ рднреА рдКрдкрд░ рд╡рд╛рд▓рд╛ рдиреЛрдб рд╣реИ рдХрд┐рд╕реА рднреА рджреВрд░реА рдкрд░ (рдЖрдкрдХреЗ рдореИрдиреЗрдЬрд░ рдХрд╛ рдореИрдиреЗрдЬрд░)ред
  • рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рдХреЛрдИ рднреА рдирд┐рдЪрд▓рд╛ рдиреЛрдб рд╣реИ рдХрд┐рд╕реА рднреА рджреВрд░реА рдкрд░ (рдЖрдкрдХреЗ рдиреАрдЪреЗ рд╣рд░ рдХреЛрдИ)ред

рдЙрджрд╛рд╣рд░рдг: рдЕрдЧрд░ Sales рдПрдХ рдирдП VP рдХреЗ рддрд╣рдд рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреЛ рдЪреАрдЬрд╝реЗрдВ рддреБрд░рдВрдд рд╕рддреНрдп рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдПред рдбреИрд╢рдмреЛрд░реНрдбреНрд╕ рдЕрднреА рднреА "рд╕рдВрдкреВрд░реНрдг Sales" рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ, рдФрд░ рдирдП VP рдХреА рдкрд░рдорд┐рд╢рдиреНрд╕ рдЕрдкрдиреЗ рдЖрдк Sales рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВред

рдЯреЗрдмрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдЪреБрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрдгрдп

рд╕реНрдХреАрдорд╛ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдРрдк рд╣рд░ рджрд┐рди рдХрд┐рди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред "рдХреМрди рдХрд┐рд╕рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ?" рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрдд рд╣реИред рдХрдИ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯреНрд╕ рдХреЛ рдпрд╣ рднреА рджрд┐рдЦрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╡рд┐рднрд╛рдЧ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдХреМрди рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдо-рдСрдлрд╝ рдХреЛ рдЕрдкреНрд░реВрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреМрди рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

рдЕрдкрдиреЗ рд╕реНрдХреНрд░реАрди рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рдХреЗ рд╕рдЯреАрдХ рд╕рд╡рд╛рд▓ рд▓рд┐рдЦ рд▓реЗрдВред рдЕрдЧрд░ рдЖрдк рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рд╕реНрдХреАрдорд╛ рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╕рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдкрд░ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред

рд╡реЗ рдлреИрд╕рд▓реЗ рдЬреЛ рд╕рдм рдХреБрдЫ рдЖрдХрд╛рд░ рджреЗрддреЗ рд╣реИрдВ:

  • рдХрд┐рди рдХреНрд╡реЗрд░реАрдЬ рдХреЛ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░, CEO рддрдХ рдЪреЗрди, рдХрд┐рд╕реА рдиреЗрддрд╛ рдХреЗ рдиреАрдЪреЗ рдкреВрд░рд╛ рд╕рдмрдЯреНрд░реА, рдпрд╛ "рд╡рд┐рднрд╛рдЧ X рдХреЗ рд╕рднреА рд▓реЛрдЧ"?
  • рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдХреНрдЯ рдЯреНрд░реА рд╣реИ (рдПрдХ рдореИрдиреЗрдЬрд░) рдпрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдСрд░реНрдЧ (рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдореИрдиреЗрдЬрд░ рдпрд╛ рд▓реАрдб)?
  • рдХреНрдпрд╛ рд╡рд┐рднрд╛рдЧ рд▓реЛрдЧ рд╡рд╛рд▓реА рдЙрд╕реА рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдХреЗ рдиреЛрдб рд╣реИрдВ, рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдПрдЯреНрд░реАрдмреНрдпреВрдЯ (рдЬреИрд╕реЗ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдкрд░ department_id) рд╣реИрдВ?
  • рдХреНрдпрд╛ рдХреЛрдИ рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЯреАрдореЛрдВ рдХрд╛ рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╢реЗрдпрд░реНрдб рд╕рд░реНрд╡рд┐рд╕реЗрдЬ, рд╕реНрдХреНрд╡реИрдбреНрд╕)?
  • рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреИрд╕реЗ рдлреНрд▓реЛ рдХрд░рддреЗ рд╣реИрдВ: рдбрд╛рдЙрди-рдЯреНрд░реА, рдЕрдк-рдЯреНрд░реА, рдпрд╛ рджреЛрдиреЛрдВ?

рдпреЗ рдЪреБрдиреМрддрд┐рдпрд╛рдБ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ "рд╕рд╣реА" рдбреЗрдЯрд╛ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред рдЕрдЧрд░ Alex рджреЛрдиреЛрдВ Support рдФрд░ Onboarding рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХрд▓ manager_id рдпрд╛ "рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реАрдб" рдХрд╛ рдирд┐рдпрдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдкрдХреЛ рдПрдХ рдЬреЙрдЗрди рдЯреЗрдмрд▓ (рд▓реАрдбрд░ рдЯреВ рдЯреАрдо) рдЪрд╛рд╣рд┐рдП рдпрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдиреАрддрд┐ рдЬреИрд╕реЗ "рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдЯреАрдо, рд╕рд╛рде рдореЗрдВ рдбреЙрдЯреЗрдб-рд▓рд╛рдЗрди рдЯреАрдореЗрдВ"ред

рд╡рд┐рднрд╛рдЧ рдПрдХ рдФрд░ рдлрд╝рд░реНрдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╡рд┐рднрд╛рдЧ рдиреЛрдбреНрд╕ рд╣реИрдВ, рддреЛ рдЖрдк рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ "рд╡рд┐рднрд╛рдЧ A рдореЗрдВ рдЯреАрдо B рд╣реИ рдФрд░ рдЯреАрдо B рдореЗрдВ рд╡реНрдпрдХреНрддрд┐ C рд╣реИ"ред рдЕрдЧрд░ рд╡рд┐рднрд╛рдЧ рдЕрд▓рдЧ рд╣реИрдВ, рддреЛ рдЖрдк department_id = X рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ рдкрд░ рддрдм рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЯреАрдореЗрдВ рд╡рд┐рднрд╛рдЧреЛрдВ рдореЗрдВ рдлреИрд▓реА рд╣реЛрдВред

рдЕрдВрдд рдореЗрдВ, рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреЛ рд╕рд╛рдзрд╛рд░рдг рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред "рдПрдХ рдореИрдиреЗрдЬрд░ рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрддрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдкрд░ рдкреАрдпрд░реНрд╕ рдирд╣реАрдВ" рдПрдХ рдбрд╛рдЙрди-рдЯреНрд░реА рдирд┐рдпрдо рд╣реИред "рдХреЛрдИ рднреА рдЕрдкрдиреА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЪреЗрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ" рдПрдХ рдЕрдк-рдЯреНрд░реА рдирд┐рдпрдо рд╣реИред рдЗрд╕реЗ рдЬрд▓реНрджреА рддрдп рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдореЙрдбрд▓ рд╕рд╣рдЬ рд▓рдЧреЗрдЧрд╛ рдФрд░ рдХреМрди рд╕рд╛ рдорд╣рдБрдЧреА рдХреНрд╡реЗрд░реАрдЬ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ: рдореИрдиреЗрдЬрд░ рдФрд░ рдЯреАрдореНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕реНрдХреАрдорд╛

рдЕрдЧрд░ рдЖрдк рдХрдо рд╣рд┐рд╕реНрд╕реЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреНрд▓рд╛рд╕рд┐рдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рд╣реИред рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдЕрдкрдиреЗ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпреЗ рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓рдХрд░ рдЯреНрд░реА рдмрдирд╛рддреЗ рд╣реИрдВред

рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯрдЕрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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)ред рдпрд╣ рднреА рддрдп рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдореИрдиреЗрдЬрд░ рдЙрд╕реА рдЯреАрдо рдпрд╛ рд╡рд┐рднрд╛рдЧ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╕реЙрдлреНрдЯ-рдбрд┐рд▓реАрдЯреНрд╕ рдпрд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдмрджрд▓рд╛рд╡ (рдСрдбрд┐рдЯрд┐рдВрдЧ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд▓рд╛рдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП) рдЪрд╛рд╣рд┐рдПред

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрджрд▓рд╛рд╡ рд╕рд░рд▓ рд▓рд┐рдЦрд╛рдИ рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рдореИрдиреЗрдЬрд░ рдмрджрд▓рдиреЗ рдкрд░ employees.manager_id рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЯреАрдо рдореВрд╡ рдХрд░рдиреЗ рдкрд░ employees.team_id рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ (рдЕрдХреНрд╕рд░ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде)ред рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдЦрди рдмрд╣реБрдд рдмрдбрд╝реЗ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рднрд╛рд╡ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд░реЛрд▓рдЕрдк рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдИ рднреА "рдореИрдиреЗрдЬрд░ рд╕рднреА рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ" рдирд┐рдпрдо рдЕрдм рдирдИ рдЪреЗрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╕рд╛рджрдЧреА рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рддрд╛рдХрдд рд╣реИред рдЗрд╕рдХреА рдХрдордЬреЛрд░реА рддрдм рджрд┐рдЦрддреА рд╣реИ рдЬрдм рдЖрдк рдЕрдХреНрд╕рд░ "рдЗрд╕ рдореИрдиреЗрдЬрд░ рдХреЗ рдиреАрдЪреЗ рд╕рднреА" рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рд╣рд░ рдмрд╛рд░ рдЯреНрд░реА рдХреЛ рд╡реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреНрд╡реЗрд░реАрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рддреЗ рд╣реИрдВред

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ: рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡реЗрд░реАрдЬ

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдХрдИ рдЙрдкрдпреЛрдЧреА рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рд╕рд╡рд╛рд▓ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреНрд╡реЗрд░реАрдЬ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдЗрд╕ рддрд░рд╣ рдореЙрдбрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпреЗ рдкреИрдЯрд░реНрди рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рдЪрд▓рд╛рдПрдБрдЧреЗред

рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ (рдПрдХ рд╕реНрддрд░)

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдг рдХреЗрд╕ рд╣реИ рдПрдХ рдореИрдиреЗрдЬрд░ рдХреА рддрддреНрдХрд╛рд▓ рдЯреАрдо:

SELECT id, full_name, title
FROM employees
WHERE manager_id = $1
ORDER BY full_name;

рдпрд╣ рддреЗрдЬрд╝ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рддрдХ рдЬрд╛рддрд╛ рд╣реИред

рдЪреЗрди рдСрдл рдХрдорд╛рдВрдб (рдКрдкрд░ рдХреА рддрд░рдл)

рдХрд┐рд╕реА рдХрд╛ рдХреМрди рдХрд┐рд╕рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ (рдореИрдиреЗрдЬрд░, рдореИрдиреЗрдЬрд░ рдХрд╛ рдореИрдиреЗрдЬрд░ рд╡рдЧреИрд░рд╣) рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХрд░реНрд╕рд┐рд╡ 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;

рдпрд╣ рдЕрдкреНрд░реВрд╡рд▓реНрд╕, рдПрд╕реНтАНрдХреЗрд▓реЗрд╢рди рдкрд╛рдереНрд╕, рдФрд░ рдореИрдиреЗрдЬрд░ рдмреНрд░реЗрдбрдХреНрд░рдореНрдмреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдкреВрд░рд╛ рд╕рдмрдЯреНрд░реА (рдиреАрдЪреЗ рдХреА рддрд░рдл)

рдХрд┐рд╕реА рдиреЗрддрд╛ рдХреЗ рдиреАрдЪреЗ рд╕рднреА рд▓реЛрдЧреЛрдВ (рд╕рднреА рд╕реНрддрд░) рдХреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдХрд░реНрд╕рди рдкрд▓рдЯ рджреЗрдВ:

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;

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдкреЛрд░реНрдЯ рд╣реИ "рд▓реАрдбрд░ Y рдХреЗ рдиреАрдЪреЗ рд╡рд┐рднрд╛рдЧ X рдХреЗ рд╕рднреА рд▓реЛрдЧ":

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;

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреНрд╡реЗрд░реАрдЬ рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреЗ рд▓рд┐рдП рд░рд┐рд╕реНрдХреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХреНрд╕реЗрд╕ рдЪреЗрдХ рдЕрдХреНрд╕рд░ рдкреВрд░реЗ рдкрд╛рде рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпрд╛ рд╡реНрдпреВрдЕрд░ рдЗрд╕ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдирд╕реЗрд╕реНрдЯрд░ рд╣реИ?). рдЕрдЧрд░ рдХреЛрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд░рд┐рдХрд░реНрд╕рди рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓реАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╕рд╛рде рд╣реА рд╕рд╛рдЗрдХрд┐рд▓реНрд╕ рдФрд░ рдорд┐рд╕рд┐рдВрдЧ рдореИрдиреЗрдЬрд░реНрд╕ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдЗрд╢реНрдпреВрдЬрд╝ рдкрд░ рдирдЬрд╝рд░ рд░рдЦреЗрдВред рдПрдХ рдЧрд▓рдд рд░рд┐рдХреЙрд░реНрдб рд░рд┐рдХрд░реНрд╕рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рдорд┐рд╢рди рдХреНрд╡реЗрд░реАрдЬ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдирд┐рдпрд╛рдВ рдФрд░ рдЕрдЪреНрдЫреЗ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдВрдЯреНрд╕ рдЪрд╛рд╣рд┐рдПред

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓: рдпрд╣ рдкреВрд░реА рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИ

рдЕрдкрдиреЗ рдЬрдирд░реЗрдЯреЗрдб рдХреЛрдб рдХреЗ рдорд╛рд▓рд┐рдХ рдмрдиреЗрдВ
рдЬрдм рдЬрд╝рд░реВрд░рдд рд╣реЛ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЛрд░реНрд╕ рдХреЛрдб рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд░рдЦреЗрдВред
рдХреЛрдб рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░реЗрдВ

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рд╣рд░ рдПрдирд╕реЗрд╕реНрдЯрд░-рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд░рд┐рд╢реНрддрд╛ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИ, рдХреЗрд╡рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рд▓рд┐рдВрдХ рдирд╣реАрдВред рдЖрдк рдЯреНрд░реА рдХреЛ рдПрдХ-рдПрдХ рдХрджрдо рдЪрд▓рд╛рдиреЗ рдХреА рдмрдЬрд╛рдп рд╕реАрдзреЗ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ: "рдХрд┐рд╕рдХреЗ рдиреАрдЪреЗ рдХреМрди рд╣реИ?" рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЙрдЗрди рд╕реЗ рдкреВрд░рд╛ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рдЖрдо рддреМрд░ рдкрд░ рдЖрдк рджреЛ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд░рдЦрддреЗ рд╣реИрдВ: рдПрдХ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП (рд▓реЛрдЧ рдпрд╛ рдЯреАрдореЗрдВ) рдФрд░ рдПрдХ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдкрд╛рдереНрд╕ рдХреЗ рд▓рд┐рдПред

-- 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)
)

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЬреЛрдбрд╝реЗ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИ рдЬреИрд╕реЗ (Alice, Bob) рдорддрд▓рдм "Alice Bob рдХреА рдПрдирд╕реЗрд╕реНрдЯрд░ рд╣реИ"ред рдпрд╣ рдПрдХ рд░реЛ рднреА рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИ рдЬрд╣рд╛рдБ ancestor_id = descendant_id рдФрд░ depth = 0ред рд╢реБрд░реВ рдореЗрдВ рдпрд╣ рд╕реЗрд▓реНрдл-рд░реЛ рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИ, рдкрд░ рдпрд╣ рдХрдИ рдХреНрд╡реЗрд░реАрдЬ рдХреЛ рд╕рд╛рдлрд╝ рдмрдирд╛рддреА рд╣реИред

depth рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рджреЛ рдиреЛрдбреНрд╕ рдХрд┐рддрдиреА рджреВрд░ рд╣реИрдВ: depth = 1 рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рд╣реИ, depth = 2 рдореИрдиреЗрдЬрд░ рдХрд╛ рдореИрдиреЗрдЬрд░, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реЗ рдЕрд▓рдЧ рдЯреНрд░реАрдЯ рдХрд░рдирд╛ рд╣реЛред

рдореБрдЦреНрдп рд▓рд╛рдн рдЕрдиреБрдорд╛рдирдиреАрдп, рддреЗрдЬрд╝ рд░реАрдбреНрд╕ рд╣реИрдВ:

  • рдкреВрд░рд╛ рд╕рдмрдЯреНрд░реА рд▓реБрдХрдЕрдк рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ (рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░ рдХреЗ рдиреАрдЪреЗ рд╕рдм рдХреЛрдИ)ред
  • рдЪреЗрди рдСрдл рдХрдорд╛рдВрдб рд╕рд░рд▓ рд╣реИ (рдХрд┐рд╕реА рдХреЗ рдКрдкрд░ рдХреЗ рд╕рднреА рдореИрдиреЗрдЬрд░реНрд╕)ред
  • рдЖрдк depth рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рдХреЗ рдбрд╛рдпрд░реЗрдХреНрдЯ рдмрдирд╛рдо рдЗрдиреНрдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓рд╛рдЧрдд рдЕрдкрдбреЗрдЯреНрд╕ рдкрд░ рд╣реИред рдЕрдЧрд░ Bob рдХрд╛ рдореИрдиреЗрдЬрд░ Alice рд╕реЗ Dana рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ Bob рдФрд░ Bob рдХреЗ рдиреАрдЪреЗ рд╕рдмрдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд╝рд░ рд░реЛреЫ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ: рдкреБрд░рд╛рдиреЗ рдПрдирд╕реЗрд╕реНрдЯрд░ рдкрд╛рдереНрд╕ рдЙрд╕ рд╕рдмрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ Dana рдХреЗ рдПрдирд╕реЗрд╕реНрдЯрд░реНрд╕ рдХреЛ Bob рдХреЗ рд╕рдмрдЯреНрд░реА рдХреЗ рд╣рд░ рдиреЛрдб рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░ рдирдП рдкрд╛рдереНрд╕ рдЗрдВрд╕рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ depth рд░реАрдХреИрд▓реНрдХреБрд▓реЗрдЯ рдХрд░реЗрдВред

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓: рддреЗрдЬрд╝ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡реЗрд░реАрдЬ

рд╣рд╛рдпрд░реЗрд░рдХреА рдкрд░рдорд┐рд╢рдиреНрд╕ рдорд╛рдиреНрдп рдХрд░реЗрдВ
рд╕рд░рд▓ рдЪреЗрдХ рдХреЗ рд╕рд╛рде рд╣рд░ рд╕реНрдХреНрд░реАрди рдкрд░ тАЬрдХреМрди рдХрд┐рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИтАЭ рдХреЛ рдХрдВрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд░рдЦреЗрдВред
рдПрдХреНрд╕реЗрд╕ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣рд░ рдПрдирд╕реЗрд╕реНрдЯрд░-рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рдЬреЛрдбрд╝реА рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИ (рдЕрдХреНрд╕рд░ org_closure(ancestor_id, descendant_id, depth) рдХреЗ рд░реВрдк рдореЗрдВ)ред рдЗрд╕рд╕реЗ рдСрд░реНрдЧ рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╡рд╛рд▓ рдПрдХ рдЬреЙрдЗрди рдмрди рдЬрд╛рддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рдореИрдиреЗрдЬрд░ рдХреЗ рдиреАрдЪреЗ рд╕рдм рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдЬреЙрдЗрди рдХрд░реЗрдВ рдФрд░ depth рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ:

-- Descendants (рдкреВрд░реА рд╕рдмрдЯреНрд░реА)
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;

-- рд╕рд┐рд░реНрдл рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕
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;

рдЪреЗрди рдСрдл рдХрдорд╛рдВрдб (рдХрд┐рд╕реА рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рд╕рднреА рдПрдирд╕реЗрд╕реНрдЯрд░реНрд╕) рдХреЗ рд▓рд┐рдП рдЬреЙрдЗрди рдкрд▓рдЯ рджреЗрдВ:

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;

рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдкреНрд░реАрдХрдореНрдкреНрдпреВрдЯреЗрдб рд╣реИ, рдХрд╛рдЙрдВрдЯреНрд╕ рднреА рд╕реАрдзреА рдмрд╛рдд рд╣реИрдВ (рдХреЛрдИ рд░рд┐рдХрд░реНрд╕рди рдирд╣реАрдВ)ред рдпрд╣ рдбреИрд╢рдмреЛрд░реНрдбреНрд╕ рдФрд░ рдкрд░рдорд┐рд╢рди-рд╕реНрдХреЛрдкреНрдб рдЯреЛрдЯрд▓реНрд╕ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреЗрдЬрд┐рдиреЗрд╢рди рдФрд░ рд╕рд░реНрдЪ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк ORDER BY, LIMIT/OFFSET рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рд╕реАрдзреЗ рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд╕реЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд░ рдореЙрдбрд▓ рдХрд╛ рдкрд░рдорд┐рд╢рдиреНрд╕ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдЪреЗрдХ рдкрд░ рдЕрд╕рд░

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрд░реНрдЧ рдирд┐рдпрдо рд╕рд░рд▓ рд╣реИ: рдПрдХ рдореИрдиреЗрдЬрд░ рдЕрдкрдиреЗ рдиреАрдЪреЗ рдХреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ (рдФрд░ рдХрднреА-рдХрднреА рд╕рдВрдкрд╛рджрд┐рдд рднреА рдХрд░ рд╕рдХрддрд╛) рд╣реИред-schema рдЬрд┐рд╕рдХреЛ рдЖрдк рдЪреБрдирддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рд▓рд╛рдЧрдд рдЪреБрдХрд╛рдиреА рд╣реИ рдХрд┐ "рдХреМрди рдХрд┐рд╕рдХреЗ рдиреАрдЪреЗ рд╣реИ"ред

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдкрд░рдорд┐рд╢рди рдЪреЗрдХ рдЕрдХреНрд╕рд░ рд░рд┐рдХрд░реНрд╕рди рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 200 рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд╕реЗрдЯ рдПрдХ рд░рд┐рдХрд░реНрд╕рд┐рд╡ CTE рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рд░реНрдЧреЗрдЯ рд░реЛреЫ рдХреЛ рдЙрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде, рд╡рд╣реА рдирд┐рдпрдо рдЕрдХреНрд╕рд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрд╕реНрддрд┐рддреНрд╡ рдЬрд╛рдБрдЪ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ рдПрдирд╕реЗрд╕реНрдЯрд░ рд╣реИ?" рдЕрдЧрд░ рд╣рд╛рдБ, рддреЛ рдЕрд▓рд╛рдЙред

-- рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдкрд░рдорд┐рд╢рди рдЪреЗрдХ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ)
SELECT 1
FROM org_closure c
WHERE c.ancestor_id = :viewer_id
  AND c.descendant_id = :employee_id
LIMIT 1;

рдпрд╣ рд╕рд╛рджрдЧреА рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ рдЬрдм рдЖрдк рд░реЛ-рд▓реЗрд╡рд▓ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА (RLS) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рд░ рдХреНрд╡реЗрд░реА рдЕрдкрдиреЗ рдЖрдк рдПрдХ рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИ рдЬреИрд╕реЗ "рд╕рд┐рд░реНрдлрд╝ рд╡рд╣реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓реМрдЯрд╛рдПрдБ рдЬреЛ рд╡реНрдпреВрдЕрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ"ред рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдирд┐рдпрдо рдЕрдХреНрд╕рд░ рд░рд┐рдХрд░реНрд╕рди рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЯреНрдпреВрди рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде, рдкреЙрд▓рд┐рд╕реА рдЕрдХреНрд╕рд░ рд╕рд░рд▓ EXISTS (...) рдЪреЗрдХ рд╣реЛрддреА рд╣реИред

рдПрдЬ рдХреЗрд╕ рдЬрд╣рд╛рдБ рдкрд░рдорд┐рд╢рди рд▓реЙрдЬрд┐рдХ рдЕрдХреНрд╕рд░ рдЯреВрдЯрддрд╛ рд╣реИ:

  • рдбреЙрдЯреЗрдб-рд▓рд╛рдЗрди рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ: рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкрд╛рд╕ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рджреЛ рдореИрдиреЗрдЬрд░ рд╣реЛрдВред
  • рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдФрд░ рдбреЗрд▓реАрдЧреЗрдЯреНрд╕: рдПрдХреНрд╕реЗрд╕ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЧреНрд░рд╛рдВрдЯ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ (рдЕрдХреНрд╕рд░ рдПрдХреНрд╕рдкрд╛рдпрд░реА рдХреЗ рд╕рд╛рде)ред
  • рдЕрд╕реНрдерд╛рдпреА рдПрдХреНрд╕реЗрд╕: рдЯрд╛рдЗрдо-рдмрд╛рдЙрдВрдб рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреЛ рдСрд░реНрдЧ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рди рдмреБрдиреЗрдВред
  • рдХреНрд░реЙрд╕-рдЯреАрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕: рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рджрд╕реНрдпрддрд╛ рджреНрд╡рд╛рд░рд╛ рджреЗрдВ, рди рдХрд┐ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЪреЗрди рджреНрд╡рд╛рд░рд╛ред

рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ AppMaster рдореЗрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЕрдХреНрд╕рд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдореИрдк рд╣реЛрддреА рд╣реИ рдФрд░ рд╡реЗрдм/рдореЛрдмрд╛рдЗрд▓ рдРрдкреНрд╕ рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдЪреЗрдХ рдЦреБрдж рд╕рд░рд▓ рд░рдЦрддреЗ рд╣реИрдВред

рдЯреНрд░реЗрдбрдСрдлрд╝: рд╕реНрдкреАрдб, рдЬрдЯрд┐рд▓рддрд╛, рдФрд░ рдореЗрдВрдЯреЗрдиреЗрдВрд╕

рдПрдХ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╢рд┐рдк рдХрд░реЗрдВ
рд╕рд░реНрдЪ, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдореИрдиреЗрдЬрд░ рдбреНрд░рд┐рд▓рдбрд╛рдЙрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдСрд░реНрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛рдПрдВред
рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ

рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЪреБрдирд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ: рд╕рд░рд▓ рд░рд╛рдЗрдЯреНрд╕ рдФрд░ рдЫреЛрдЯрд╛ рд╕реНрдХреАрдорд╛, рдпрд╛ "рдХрд┐рд╕рдХрд╛ рдиреАрдЪреЗ рдХреМрди рд╣реИ" рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд░реАрдбреНрд╕ред

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рддрд╛рд▓рд┐рдХрд╛ рдЫреЛрдЯреА рдФрд░ рдЕрдкрдбреЗрдЯ рдЖрд╕рд╛рди рд░рдЦрддреА рд╣реИред рд▓рд╛рдЧрдд рд░реАрдбреНрд╕ рдкрд░ рдЖрддреА рд╣реИ: рдкреВрд░рд╛ рд╕рдмрдЯреНрд░реА рдЖрдорддреМрд░ рдкрд░ рд░рд┐рдХрд░реНрд╕рди рдорд╛рдВрдЧрддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреА рдСрд░реНрдЧ рдЫреЛрдЯреА рд╣реИ, рдЖрдкрдХрд╛ UI рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реНрддрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рд╣рд╛рдпрд░рд╛рд░реНрдХреА-рдЖрдзрд╛рд░рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рдХреБрдЫ рд╣реА рдЬрдЧрд╣реЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВред

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЯреНрд░реЗрдбрдСрдлрд╝ рдкрд▓рдЯ рджреЗрддреА рд╣реИред рд░реАрдбреНрд╕ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдирд┐рдпрдорд┐рдд рдЬреЙрдЗрди рд╕реЗ "рд╕рднреА рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ" рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдореВрд╡ рдпрд╛ рд░рд┐рдЗрдВрдСрд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рд░реЛреЫ рдХреЛ рдЗрдВрд╕рд░реНрдЯ/рдбрд┐рд▓реАрдЯ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдореЗрдВ рдЯреНрд░реЗрдбрдСрдл рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

  • рд░реАрдб рдкреНрд░рджрд░реНрд╢рди: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рдХреЛ рд░рд┐рдХрд░реНрд╕рди рдЪрд╛рд╣рд┐рдП; рдХреНрд▓реЛрдЬрд╝рд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдЬреЙрдЗрди рд╣реИрдВ рдФрд░ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдСрд░реНрдЧ рдмрдврд╝реЗ рддреЗрдЬрд╝ рд░рд╣рддреЗ рд╣реИрдВред
  • рд░рд╛рдЗрдЯ рдЬрдЯрд┐рд▓рддрд╛: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рдПрдХ parent_id рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ; рдХреНрд▓реЛрдЬрд╝рд░ рдПрдХ рдореВрд╡ рдкрд░ рдХрдИ рд░реЛреЫ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
  • рдбреЗрдЯрд╛ рдЖрдХрд╛рд░: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓реЛрдЧреЛрдВ/рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ; рдХреНрд▓реЛрдЬрд╝рд░ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧрд╣рд░реЗ рдЯреНрд░реА рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ N^2)ред

рджреЛрдиреЛрдВ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ, рдкрд░ рд▓рдХреНрд╖реНрдп рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ:

  • рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ: рдкреЗрд░реЗрдВрдЯ рдкреЙрдЗрдВрдЯрд░ (manager_id) рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рдЬреИрд╕реЗ рдПрдХ "active" рдлреНрд▓реИрдЧред
  • рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓: (ancestor_id, descendant_id) рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП descendant_id рдкрд░ рднреА рдЗрдВрдбреЗрдХреНрд╕ред

рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо: рдЕрдЧрд░ рдЖрдк рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣рд╛рдпрд░рд╛рд░реНрдХреА рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рд╕рд┐рд░реНрдлрд╝ "рдореИрдиреЗрдЬрд░ рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рджреЗрдЦрддрд╛ рд╣реИ" рд╣реИрдВ, рддреЛ рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдЕрдХреНрд╕рд░ рдХрд╛рдлреА рд╣реИред рдЕрдЧрд░ рдЖрдк рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ "VP X рдХреЗ рдиреАрдЪреЗ рд╕рдм рд▓реЛрдЧ" рд░рд┐рдкреЛрд░реНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд╡рд┐рднрд╛рдЧ рдЯреНрд░реА рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдХрдИ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рд╛рдпрд░рд╛рд░реНрдХреА-рдЖрдзрд╛рд░рд┐рдд рдкрд░рдорд┐рд╢рдиреНрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЕрдХреНрд╕рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдВрдЯреЗрдиреЗрдВрд╕ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░ рджреЗрддреА рд╣реИред

рд╕реНрдЯреЗрдк-рдмрд╛рдп-рд╕реНрдЯреЗрдк: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рд╕реЗ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдкрд░ рдЬрд╛рдирд╛

рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рджрд┐рди рдореЙрдбрд▓ рдЪреБрдирдирд╛ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╛рд╕реНрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ (manager_id рдпрд╛ parent_id) рд░рдЦреЗрдВ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЬреЛрдбрд╝реЗрдВ, рдлрд┐рд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд░реАрдбреНрд╕ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рдЬреЛрдЦрд┐рдо рдШрдЯрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдирдпрд╛ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд╡реЗрд░реАрдЬ рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╢реБрд░реВрдЖрдд рдореЗрдВ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдмрдирд╛рдпреЗрдВ (рдЕрдХреНрд╕рд░ org_closure рдХрд╣рд▓рд╛рддреА рд╣реИ) рдЬрд┐рд╕рдореЗрдВ ancestor_id, descendant_id, рдФрд░ depth рдЬреИрд╕реЗ рдХреЙрд▓рдо рд╣реЛрдВред рдЗрд╕реЗ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди employees рдпрд╛ teams рдЯреЗрдмрд▓ рд╕реЗ рдЕрд▓рдЧ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдЖрдк рдмреИрдХрдлрд┐рд▓ рдФрд░ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░ рд╕рдХреЗрдВ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рдлрд╝реАрдЪрд░реНрд╕ рдХреЛ рдЫреБрдПред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реЛрд▓рдЖрдЙрдЯ:

  • рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдпреЗрдВ рдЬрдмрдХрд┐ рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рд╕реЛрд░реНрд╕-рдСрдл-рдЯреНрд░реВрде рдмрдиреА рд░рд╣реЗред
  • рд╡рд░реНрддрдорд╛рди рдореИрдиреЗрдЬрд░ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рд╕реЗ рдХреНрд▓реЛрдЬрд╝рд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдмреИрдХрдлрд┐рд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗрд▓реНрдл рд░реЛ (depth = 0) рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛред
  • рд╕реНрдкреЙрдЯ рдЪреЗрдХреНрд╕ рд╕реЗ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ: рдХреБрдЫ рдореИрдиреЗрдЬрд░ рдЪреБрдиреЗрдВ рдФрд░ рджреЛрдиреЛрдВ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдПрдХ рдЬреИрд╕рд╛ рд╕рдмрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕реЗрдЯ рджрд┐рдЦрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рджреЗрдЦреЗрдВред
  • рдкрд╣рд▓реЗ рд░реАрдб рдкрд╛рдереНрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ: рд░рд┐рдкреЛрд░реНрдЯреНрд╕, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рд╕реЗ рдкрдврд╝реЗрдВ, рдлрд┐рд░ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рде рдХреЛ рдмрджрд▓реЗрдВред
  • рд╣рд░ рд▓рд┐рдЦрд╛рдИ рдкрд░ рдХреНрд▓реЛрдЬрд╝рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рд░рдЦреЗрдВ (re-parent, hire, move team)ред рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ рд░рд┐рдХрд░реНрд╕рди-рдЖрдзрд╛рд░рд┐рдд рдХреНрд╡реЗрд░реАрдЬ рд░рд┐рдЯрд╛рдпрд░ рдХрд░ рджреЗрдВред

рдЬрдм рдЖрдк рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ, рддреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдореЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ: рдореИрдиреЗрдЬрд░ рдЪреЗрдВрдЬреЗрд╕, рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рд▓реАрдбрд░реНрд╕, рдФрд░ рдЬрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдХреЛрдИ рдореИрдиреЗрдЬрд░ рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдЖрдк AppMaster рдореЗрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреБрд░рд╛рдиреЗ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдЪрд▓рддреЗ рд░рд╣рддреЗ рд╣реБрдП рдирдП рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреНрд▓реЛрдЬрд╝рд░ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реА рд╕реНрд╡рд┐рдЪ рдХрд░ рджреЗрдВред

рдЖрдо рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдСрд░реНрдЧ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдпрд╛ рдкрд░рдорд┐рд╢рдиреНрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрддреА рд╣реИрдВ

рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ APIs рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ
рдЕрдкрдиреЗ рдСрд░реНрдЧ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди-рд░реЗрдбреА APIs рдореЗрдВ рдмрджрд▓реЗрдВ рдмрд┐рдирд╛ рд╣реИрдВрдб-рдХреЛрдбрд┐рдВрдЧ рдХреЗред
рдмреИрдХрдПрдВрдб рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ

рдСрд░реНрдЧ рдлреАрдЪрд░реНрд╕ рддреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╣реИ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдХреЛ рдЕрд╕рдВрдЧрддрд┐ рд╣реЛрдиреЗ рджреЗрдирд╛ред рдбреЗрдЯрд╛ рдкрдВрдХреНрддрд┐-рджрд░-рдкрдВрдХреНрддрд┐ рд╕рд╣реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ, рдкрд░ рдЫреЛрдЯреА рдЧрд▓рддрд┐рдпрд╛рдБ рдЧрд▓рдд рдлрд╝рд┐рд▓реНрдЯрд░, рдзреАрдореЗ рдкреЗрдЬ, рдпрд╛ рдкрд░рдорд┐рд╢рди рд▓реАрдХ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдЗрдХрд┐рд▓ рдмрдирд╛рдирд╛ рд╣реИ: A B рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдиреЗ B рдХреЛ A рдХрд╛ рдореИрдиреЗрдЬрд░ рд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ (рдпрд╛ 3-4 рд▓реЛрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдВрдмрд╛ рд▓реВрдк)ред рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреНрд╡реЗрд░реАрдЬ рдЕрдирд┐рд╢реНрдЪрд┐рддрдХрд╛рд▓ рддрдХ рдЪрд▓ рд╕рдХрддреА рд╣реИрдВ, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд░реЛреЫ рд▓реМрдЯ рд╕рдХрддреА рд╣реИрдВ, рдпрд╛ рдЯрд╛рдЗрдо рдЖрдЙрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рднреА рд╕рд╛рдЗрдХрд┐рд▓реНрд╕ рдПрдирд╕реЗрд╕реНрдЯрд░/рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд░реЛреЫ рдХреЛ рджреВрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдПрдХ рдФрд░ рдЖрдо рд╕рдорд╕реНрдпрд╛ рдХреНрд▓реЛрдЬрд╝рд░ рдбреНрд░рд┐рдлреНрдЯ рд╣реИ: рдЖрдкрдиреЗ рдХрд┐рд╕реА рдХрд╛ рдореИрдиреЗрдЬрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдкрд░ рдХреЗрд╡рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдЕрдкрдбреЗрдЯ рдХреА рдФрд░ рд╕рдмрдЯреНрд░реА рдХреЗ рдХреНрд▓реЛрдЬрд╝рд░ рд░реЛреЫ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рднреВрд▓ рдЧрдПред рддрдм "рдЗрд╕ VP рдХреЗ рдиреАрдЪреЗ рд╕рдм рд▓реЛрдЧ" рдЬреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдорд┐рд╢реНрд░рдг рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдкрдХрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреЗрдЬ рдЕрднреА рднреА рд╕рд╣реА рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рддрдм рднреА рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рд╡рд┐рднрд╛рдЧреЛрдВ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдо рдХреЗ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рднрд╛рдЧ рдЕрдХреНрд╕рд░ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рд╕рдореВрд╣ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдорддрд▓рдм рдореИрдиреЗрдЬрд░реНрд╕ рд╕реЗ рд╣реИред рдЕрдЧрд░ рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рдЯреНрд░реА рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ "рд╡рд┐рднрд╛рдЧ рдореВрд╡" рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдмрджрд▓ рджреЗрдЧрд╛ред

рд╕рдмрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдмрд╛рд░ рдкрд░рдорд┐рд╢рдиреНрд╕ рддрдм рдлреЗрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЪреЗрдХ рд╕рд┐рд░реНрдлрд╝ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк viewer is manager of employee рдкрд░ рдПрдХреНрд╕реЗрд╕ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреВрд░реА рдЪреЗрди рдХреЛ рдорд┐рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдирддреАрдЬрд╛ рдпрд╛ рддреЛ рдУрд╡рд░-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╣реЛрдЧрд╛ (рд╕реНрдХрд┐рдк-рд▓реЗрд╡рд▓ рдореИрдиреЗрдЬрд░реНрд╕ рдЕрдкрдиреА рдЯреАрдо рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рддреЗ) рдпрд╛ рдУрд╡рд░-рд╢реЗрдпрд░рд┐рдВрдЧ (рдХрд┐рд╕реА рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдмрдирд╛рдХрд░ рдПрдХреНрд╕реЗрд╕ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ)ред

рдзреАрдореЗ рд▓рд┐рд╕реНрдЯ рдкреЗрдЬ рдЕрдХреНрд╕рд░ рд╣рд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкрд░ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЖрддреЗ рд╣реИрдВ (рд╣рд░ рдЗрдирдмреЙрдХреНрд╕, рд╣рд░ рдЯрд┐рдХрдЯ рд▓рд┐рд╕реНрдЯ, рд╣рд░ рдХрд░реНрдордЪрд╛рд░реА рд╕рд░реНрдЪ)ред рдЕрдЧрд░ рд╡рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╛ рддреЛ рдЖрдк рдкреНрд░реАрдХрдореНрдкреНрдпреВрдЯреЗрдб рдкрд╛рде (рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓) рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЕрдиреБрдордд рдХрд░реНрдордЪрд╛рд░реА IDs рдХрд╛ рдХреИрд╢реНрдб рд╕реЗрдЯред

рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп:

  • рдореИрдиреЗрдЬрд░ рдмрджрд▓рд╛рд╡ рд╕реЗрд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реИрд▓рд┐рдбреЗрд╢рди рдХрд░рдХреЗ рд╕рд╛рдЗрдХрд┐рд▓реНрд╕ рдмреНрд▓реЙрдХ рдХрд░реЗрдВред
  • "рд╡рд┐рднрд╛рдЧ" рдХрд╛ рдЕрд░реНрде рддрдп рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рд░рдЦреЗрдВред
  • рдЕрдЧрд░ рдЖрдк рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдиреЗрдЬрд░ рдмрджрд▓рд╛рд╡ рдкрд░ рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд░реЛреЫ рдХреЛ рд░реАрдмрд┐рд▓реНрдб рдХрд░реЗрдВред
  • рдкрд░рдорд┐рд╢рди рдирд┐рдпрдо рдкреВрд░реА рдЪреЗрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ, рд╕рд┐рд░реНрдл рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред
  • рд╕реВрдЪреА рдкреЗрдЬреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рд░рд┐рдХрд░реНрд╕рди рдХреА рдмрдЬрд╛рдп рдСрд░реНрдЧ рд╕реНрдХреЛрдкреНрд╕ рдкреНрд░реАрдХрдореНрдкреНрдпреВрдЯ рдХрд░реЗрдВред

рдЕрдЧрд░ рдЖрдк AppMaster рдореЗрдВ рдПрдбрдорд┐рди рдкреИрдирд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ "рдореИрдиреЗрдЬрд░ рдмрджрд▓реЗрдВ" рдХреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕рдордЭреЗрдВ: рдЗрд╕реЗ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рддрднреА рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдиреЗ рджреЗрдВред

рд╢рд┐рдк рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд▓реНрджреА рдЪреЗрдХрд▓рд┐рд╕реНрдЯ

рд░реЛрд▓-рдЖрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯрд▓ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ
рдРрд╕рд╛ рд╕реНрдЯрд╛рдл рдкреЛрд░реНрдЯрд▓ рджреЗрдВ рдЬрд╣рд╛рдБ рд╡реНрдпреВрдЬрд╝ рдЕрдкрдиреЗ-рдЖрдк тАЬрдореЗрд░реЗ рдСрд░реНрдЧтАЭ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╕реНрдХреЛрдк рдХрд┐рдП рдЬрд╛рдПрдБред
рдкреЛрд░реНрдЯрд▓ рдмрдирд╛рдПрдВ

рдЕрдкрдиреЗ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдХреЛ "рдбрди" рдХрд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХреНрд╕реЗрд╕ рдХреЛ рд╕рд╛рдзрд╛рд░рдг рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕рдордЭрд╛ рд╕рдХреЗрдВред рдЕрдЧрд░ рдХреЛрдИ рдкреВрдЫреЗ, "рдХреМрди рдХрд░реНрдордЪрд╛рд░реА X рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВ?", рддреЛ рдЖрдк рдПрдХ рдирд┐рдпрдо рдФрд░ рдПрдХ рдХреНрд╡реЗрд░реА (рдпрд╛ рд╡реНрдпреВ) рджрд┐рдЦрд╛ рдХрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдорд╛рдг рджреЗ рд╕рдХреЗрдВред

рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдЕрдЧрд▓рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░реАрдХреНрд╖рдг рд╣реИред рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, "рдХрд┐рд╕реА рдореИрдиреЗрдЬрд░ рдХреЗ рдиреАрдЪреЗ рд╕рднреА рджрд┐рдЦрд╛рдУ" рдПрдХ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреНрд╡реЗрд░реА рдмрди рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдХреА рд╕реНрдкреАрдб рдЧрд╣рд░рд╛рдИ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде, рд░реАрдбреНрд╕ рдЖрдорддреМрд░ рдкрд░ рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░ рдЖрдкрдХреЛ рд╣рд░ рдмрджрд▓рд╛рд╡ рдкрд░ рдЯреЗрдмрд▓ рд╕рд╣реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рдЗрдЯ рдкрд╛рде рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░реА-рд╢рд┐рдк рдЪреЗрдХрд▓рд┐рд╕реНрдЯ:

  • рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рдЪреБрдиреЗрдВ рдФрд░ рд╡рд┐рдЬрд╝рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреНрд░реЗрд╕ рдХрд░реЗрдВ: рдХреМрди рд╕реА рдЪреЗрди рдПрдХреНрд╕реЗрд╕ рджреЗрддреА рд╣реИ, рдФрд░ рдХреМрди рд╕рд╛ рд░реЛрд▓ рдЙрд╕реЗ рдирдХрд╛рд░рддрд╛ рд╣реИред
  • рдЕрдкрдиреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рд╛рдЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдиреЗрдЬрд░ рд╕рдмрдЯреНрд░реА рдХреНрд╡реЗрд░реА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг: 5 рд▓реЗрд╡рд▓ рдЧрд╣рд░рд╛рдИ рдФрд░ 50,000 рдХрд░реНрдордЪрд╛рд░реА)ред
  • рдЧрд▓рдд рд▓рд┐рдЦрд╛рдЗрдпреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ: рд╕рд╛рдЗрдХрд┐рд▓реНрд╕, рд╕реЗрд▓реНрдл-рдореИрдиреЗрдЬрдореЗрдВрдЯ, рдФрд░ рдЕрдирдСрд░рдлрд╝рди рдиреЛрдбреНрд╕ рдХреЛ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдВрдЯреНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрдЬрд╝реИрдХреНрд╢рди рдЪреЗрдХреНрд╕ рд╕реЗ рд░реЛрдХреЗрдВред
  • рд░рд┐рдЗрдВрдСрд░реНрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: рдореВрд╡реНрд╕, рдорд░реНрдЬреЗрд╕, рдореИрдиреЗрдЬрд░ рдмрджрд▓рд╛рд╡, рдФрд░ рдмреАрдЪ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд░реЛрд▓рдмреИрдХ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВред
  • рдкрд░рдорд┐рд╢рди рдЯреЗрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреВрдорд┐рдХрд╛рдУрдВ (HR, рдореИрдиреЗрдЬрд░, рдЯреАрдо рд▓реАрдб, рд╕рдкреЛрд░реНрдЯ) рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рдЙ рдФрд░ рдбрд┐рдирд╛рдЗрдб рдПрдХреНрд╕реЗрд╕ рджреЛрдиреЛрдВ рдХрд╛ Assertion рдХрд░реЗрдВред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ: рдПрдХ рд╕рдкреЛрд░реНрдЯ рдПрдЬреЗрдВрдЯ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╡рд┐рднрд╛рдЧ рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рдореИрдиреЗрдЬрд░ рдЕрдкрдиреЗ рдкреВрд░реЗ рд╕рдмрдЯреНрд░реА рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рдирд┐рдпрдореЛрдВ рдХреЛ рдЯреЗрд╕реНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд┐рдк рдХрд░рдиреЗ рдХреЗ рдХрд╝рд░реАрдм рд╣реИрдВред

рдЕрдЧрд░ рдЖрдк рдпрд╣ рдЗрдВрдЯрд░рдирд▓ рдЯреВрд▓ AppMaster рдореЗрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрди рдЪреЗрдХреНрд╕ рдХреЛ рдЙрди рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдСрдЯреЛрдореЗрдЯреЗрдб рдЯреЗрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВ рдЬреЛ рдСрд░реНрдЧ рд▓рд┐рд╕реНрдЯ рдФрд░ рдХрд░реНрдордЪрд╛рд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рд╕рд┐рд░реНрдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред

рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рдЕрдЧрд▓реЗ рдХрджрдо

рдорд╛рди рд▓реЗрдВ рдПрдХ рдХрдВрдкрдиреА рдореЗрдВ рддреАрди рд╡рд┐рднрд╛рдЧ рд╣реИрдВ: Sales, Support, рдФрд░ Engineeringред рд╣рд░ рд╡рд┐рднрд╛рдЧ рдХреА рджреЛ рдЯреАрдореЗрдВ рд╣реИрдВ, рдФрд░ рд╣рд░ рдЯреАрдо рдХрд╛ рдПрдХ рд▓реАрдб рд╣реИред Sales рд▓реАрдб A рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдЕрдкреНрд░реВрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, Support рд▓реАрдб B рдЕрдкрдиреЗ рд╡рд┐рднрд╛рдЧ рдХреЗ рд╕рд╛рд░реЗ рдЯрд┐рдХрдЯ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ VP of Engineering Engineering рдХреЗ рдиреАрдЪреЗ рд╕рдм рдХреБрдЫ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рдПрдХ рд░рд┐рдЗрдВрдСрд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ Support рдЯреАрдо Sales рдХреЗ рддрд╣рдд рдЪрд▓реА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдПрдХ рдирдпрд╛ рдореИрдиреЗрдЬрд░ Sales рдбрд╛рдпрд░реЗрдХреНрдЯрд░ рдФрд░ рджреЛ рдЯреАрдо рд▓реАрдбреНрд╕ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рджрд┐рди, рдХрд┐рд╕реА рдиреЗ рдПрдХреНрд╕реЗрд╕ рдХреА рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреА: "Jamie (рдПрдХ Sales рдПрдирд╛рд▓рд┐рд╕реНрдЯ) рдХреЛ Sales рд╡рд┐рднрд╛рдЧ рдХреЗ рд╕рднреА рдХрд╕реНрдЯрдорд░ рдЕрдХрд╛рдЙрдВрдЯреНрд╕ рджреЗрдЦрдиреЗ рджреЗрдВ, рдкрд░ Engineering рдирд╣реАрдВред"

рдЕрдЧрд░ рдЖрдкрдиреЗ PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╕реНрдХреАрдорд╛ рд╕рд░рд▓ рд╣реИ, рдкрд░ рдРрдк рд╡рд░реНрдХ рдЖрдкрдХреЗ рдХреНрд╡реЗрд░реАрдЬ рдФрд░ рдкрд░рдорд┐рд╢рди рдЪреЗрдХреНрд╕ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред "Sales рдХреЗ рдиреАрдЪреЗ рд╕рднреА" рдЬреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдЖрдорддреМрд░ рдкрд░ рд░рд┐рдХрд░реНрд╕рди рдорд╛рдВрдЧрддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЕрдкреНрд░реВрд╡рд▓реНрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ "рдХреЗрд╡рд▓ рдЪреЗрди рдореЗрдВ рдореИрдиреЗрдЬрд░реНрд╕ рдЕрдкреНрд░реВрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"), рддреЛ рд░рд┐рдЗрдВрдСрд░реНрдЧ рдХреЗ рдмрд╛рдж рдПрдЬ рдХреЗрд╕ рдорд╛рдпрдиреЗ рд░рдЦрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред

рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде, рд░рд┐рдЗрдВрдСрд░реНрдЧ рдкрд░ рд▓рд┐рдЦрд╛рдИ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ (рдПрдирд╕реЗрд╕реНрдЯрд░/рдбрд┐рд╕реЗрдВрдбреЗрдВрдЯ рд░реЛреЫ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛), рдкрд░ рд░реАрдб рд╕рд╛рдЗрдб рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдкрд░рдорд┐рд╢рдиреНрд╕ рдЕрдХреНрд╕рд░ рд╕рд┐рдВрдкрд▓ рдЬреЙрдЗрди рдмрди рдЬрд╛рддреЗ рд╣реИрдВ: "рдХреНрдпрд╛ рдпрд╣ рдпреВрдЬрд░ рдЙрд╕ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ рдПрдирд╕реЗрд╕реНрдЯрд░ рд╣реИ?" рдпрд╛ "рдХреНрдпрд╛ рдпрд╣ рдЯреАрдо рдЗрд╕ рд╡рд┐рднрд╛рдЧ рд╕рдмрдЯреНрд░реА рдореЗрдВ рд╣реИ?"ред

рдпрд╣ рд╕реАрдзреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ: рд╡рд┐рднрд╛рдЧ-рд╕реНрдХреЛрдкреНрдб рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд┐рдХрд░реНрд╕, рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ рдХреЗ рдКрдкрд░ рдирд┐рдХрдЯрддрдо рдореИрдиреЗрдЬрд░ рдХреЛ рдЕрдкреНрд░реВрд╡рд▓ рд░реВрдЯрд┐рдВрдЧ, рд╡рд┐рднрд╛рдЧ рдбреИрд╢рдмреЛрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдбрдорд┐рди рд╡реНрдпреВрдЬрд╝, рдФрд░ рдСрдбрд┐рдЯреНрд╕ рдЬреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рджрд┐рди рдПрдХреНрд╕реЗрд╕ рдХреНрдпреЛрдВ рдореМрдЬреВрдж рдерд╛ред

рдЕрдЧрд▓реЗ рдХрджрдо:

  1. рдкрд░рдорд┐рд╢рди рдирд┐рдпрдо рд╕рд╛рдзрд╛рд░рдг рд╢рдмреНрджреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ (рдХреМрди рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВ)ред
  2. рд╡рд╣ рдореЙрдбрд▓ рдЪреБрдиреЗрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдЪреЗрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ (рддреЗрдЬрд╝ рд░реАрдбреНрд╕ рдмрдирд╛рдо рд╕рд░рд▓ рд░рд╛рдЗрдЯреНрд╕)ред
  3. рдПрдХ рдЗрдВрдЯрд░рдирд▓ рдПрдбрдорд┐рди рдЯреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рд░рд┐рдЗрдВрдСрд░реНрдЧреНрд╕, рдПрдХреНрд╕реЗрд╕ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕, рдФрд░ рдЕрдкреНрд░реВрд╡рд▓реНрд╕ рдХреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЯреЗрд╕реНрдЯ рдХрд░рдиреЗ рджреЗред

рдЕрдЧрд░ рдЖрдк рдЙрди рдСрд░реНрдЧ-рдЕрд╡реЗрдпрд░ рдПрдбрдорд┐рди рдкреИрдирд▓реНрд╕ рдФрд░ рдкреЛрд░реНрдЯрд▓реНрд╕ рдХреЛ рдЬрд▓реНрджреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ AppMaster (appmaster.io) рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдЖрдкрдХреЛ PostgreSQL-рдмреИрдХреНрдб рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд░рдиреЗ, рд╡рд┐рдЬрд╝реБрдЕрд▓ рдмрд┐рдЬрд╝рдиреЗрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдВ рдЕрдкреНрд░реВрд╡рд▓ рд▓реЙрдЬрд┐рдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рдФрд░ рдПрдХ рд╣реА рдмреИрдХрдПрдВрдб рд╕реЗ рд╡реЗрдм рдФрд░ рдиреЗрдЯрд┐рд╡ рдореЛрдмрд╛рдЗрд▓ рдРрдкреНрд╕ рджреЗрдиреЗ рджреЗрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди

Adjacency list vs closure table тАФ рдореБрдЭреЗ рдХрдм рдХреМрди рд╕рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рддрдм рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреА рдСрд░реНрдЧ рдЫреЛрдЯреА рд╣реЛ, рдЕрдкрдбреЗрдЯ рдЕрдХреНрд╕рд░ рд╣реЛрдВ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдХреНрд░реАрди рд╕рд┐рд░реНрдл рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдпрд╛ рдХреБрдЫ рд╕реНрддрд░ рд╣реА рджрд┐рдЦрд╛рддреА рд╣реЛрдВред рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рддрдм рдмреЗрд╣рддрд░ рд╣реИ рдЬрдм рдЖрдк рд▓рдЧрд╛рддрд╛рд░ тАЬрдХрд┐рд╕реА рд▓реАрдбрд░ рдХреЗ рдиреАрдЪреЗ рд╕рдм рд▓реЛрдЧтАЭ рдЬреИрд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрддреЗ рд╣реЛрдВ, рд╡рд┐рднрд╛рдЧ-рдЖрдзрд╛рд░рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд░рддреЗ рд╣реЛрдВ, рдпрд╛ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╣рд╛рдпрд░рд╛рд░реНрдХреА-рдЖрдзрд╛рд░рд┐рдд рдкрд░рдорд┐рд╢рдиреНрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реЛрдВ тАФ рдХреНрдпреЛрдВрдХрд┐ рд░реАрдбреНрд╕ рд╕рд┐рдВрдкрд▓ рдЬреЙрдЗрди рд╕реЗ рддреЗрдЬрд╝ рдФрд░ рдЕрдиреБрдорд╛рдирдиреАрдп рд╣реЛрддреЗ рд╣реИрдВред

PostgreSQL рдореЗрдВ тАЬрдХреМрди рдХрд┐рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИтАЭ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рд╕рд╛рджрд╛ рддрд░реАрдХрд╛ рд╣реИ employees(manager_id) рд░рдЦрдирд╛ рдФрд░ рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП WHERE manager_id = ? рдЬреИрд╕рд╛ рд╕рд┐рдВрдкрд▓ рдХреНрд╡реЗрд░реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ред рдХреЗрд╡рд▓ рдЙрди рдлреАрдЪрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреНрд╡реЗрд░реАрдЬ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдЪрдореБрдЪ рдкреВрд░реА рдПрдирд╕реЗрд╕реНрдЯреА рдпрд╛ рд╕рдмрдЯреНрд░реА рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреИрд╕реЗ рдЕрдкреНрд░реВрд╡рд▓реНрд╕, тАЬрдореЗрд░реА рдЯреАрдотАЭ рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╛ рд╕реНрдХрд┐рдк-рд▓реЗрд╡рд▓ рдбреИрд╢рдмреЛрд░реНрдбред

рдореИрдВ рд╕рд╛рдЗрдХрд┐рд▓ (A manages B рдФрд░ B manages A) рдХреИрд╕реЗ рд░реЛрдХреВрдВ?

рд╕реЗрд▓реНрдл-рдореИрдиреЗрдЬрдореЗрдВрдЯ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд▓рдЧрд╛рдПрдВ рдЬреИрд╕реЗ manager_id <> id, рдФрд░ рдЕрдкрдбреЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдореИрдиреЗрдЬрд░ рдХреЛ рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рд╕рдмрдЯреНрд░реА рдореЗрдВ рд╣реЛред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдореИрдиреЗрдЬрд░ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдирд╕реЗрд╕реНрдЯреНрд░рд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рд░реНрдХрд┐рд▓ рд░рд┐рдкрдЯреАрд╢рди рд╡рд╛рд▓реА рдХреНрд╡реЗрд░реАрдЬ рдХреЛ рдмрд┐рдЧрд╛рдбрд╝ рд╕рдХрддреА рд╣реИ рдФрд░ рдкрд░рдорд┐рд╢рди рд▓реЙрдЬрд┐рдХ рдХрд░рдкреНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреЛ рд▓реЛрдЧреЛрдВ рд╡рд╛рд▓реА рдЙрд╕реА рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдореЗрдВ рдиреЛрдб рдХреА рддрд░рд╣ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЕрдЪреНрдЫрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдпрд╣реА рд╣реИ рдХрд┐ рд╡рд┐рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХреАрдп рд╕рдореВрд╣ рдорд╛рдиреЗрдВ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдореИрдиреЗрдЬрд░ рдЯреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВред рдЗрд╕рд╕реЗ тАЬрд╡рд┐рднрд╛рдЧ рдореВрд╡тАЭ рд╕реЗ рдЧрд▓рддреА рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдмрджрд▓рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ тАЬSales рдореЗрдВ рд╕рднреАтАЭ рдЬреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рддрдм рднреА рд╕реНрдкрд╖реНрдЯ рд░рд╣рддреЗ рд╣реИрдВ рдЬрдм рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рднрд╛рдЧ рд╕реАрдорд╛ рд╕реЗ рдореЗрд▓ рди рд╣реЛред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛ рджреЛ рдореИрдиреЗрдЬрд░ рд╣реЛрдВ (рдореИрдЯреНрд░рд┐рдХреНрд╕ рдСрд░реНрдЧ), рддреЛ рдореИрдВ рдЙрд╕реЗ рдХреИрд╕реЗ рдореЙрдбрд▓ рдХрд░реВрдБ?

рдЕрдХреНрд╕рд░ рдЖрдк рдХрд░реНрдордЪрд╛рд░реА рдкрд░ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореИрдиреЗрдЬрд░ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЙрдЯреЗрдб-рд▓рд╛рдЗрди рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕реЗрдХреЗрдВрдбрд░реА рдореИрдиреЗрдЬрд░ рдЯреЗрдмрд▓ рдпрд╛ тАЬрдЯреАрдо рд▓реАрдбтАЭ рдореИрдкрд┐рдВрдЧред рдЗрд╕рд╕реЗ рдмреЗрд╕рд┐рдХ рд╣рд╛рдпрд░рд╛рд░реНрдХреА рдХреНрд╡реЗрд░реАрдЬ рдЯреВрдЯрддреА рдирд╣реАрдВ рдФрд░ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рдпрд╛ рдЕрдкреНрд░реВрд╡рд▓ рдбреЗрд▓реАрдЧреЗрд╢рди рдЬреИрд╕реА рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░ рдкрд╛рддреЗ рд╣реИрдВред

рдЬрдм рдХреЛрдИ рдореИрдиреЗрдЬрд░ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдореЗрдВ рдХреНрдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореВрд╡ рд╣реЛрдиреЗ рдкрд░ рдкреБрд░рд╛рдиреЗ ancestor рдкрд╛рдереНрд╕ рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдирдП рдореИрдиреЗрдЬрд░ рдХреЗ рдЕрдирд╕реНрд╕реНрдЯрд░реНрд╕ рдХреЛ рдЙрд╕ рд╕рдмрдЯреНрд░реА рдХреЗ рд╣рд░ рдиреЛрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░ рдирдП рдкрд╛рдереНрд╕ рдЗрдВрд╕рд░реНрдЯ рдХрд░реЗрдВ, рдФрд░ depth рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд▓рдХреБрд▓реЗрдЯ рдХрд░реЗрдВред рдЗрд╕реЗ рдПрдХ рдЯреНрд░рд╛рдВрдЬрд╝реИрдХреНрд╢рди рдореЗрдВ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмреАрдЪ рдореЗрдВ рдлреЗрд▓ рд╣реЛрдиреЗ рдкрд░ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдЖрдзрд╛-рдЕрдкрдбреЗрдЯреЗрдб рди рд░рд╣ рдЬрд╛рдПред

рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдХреНрд╡реЗрд░реАрдЬ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рд╕рдмрд╕реЗ рдЬрд╝рд░реВрд░реА рд╣реИрдВ?

рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП, employees(manager_id) рдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╣рд░ рдСрд░реНрдЧ рдХреНрд╡реЗрд░реА рд╡рд╣реАрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреИрд╕реЗ team_id рдпрд╛ department_id рдкрд░ рднреА рдЗрдВрдбреЗрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВред рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдЗрдВрдбреЗрдХреНрд╕ (ancestor_id, descendant_id) рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрд▓рдЧ рд╕реЗ descendant_id рдкрд░ рднреА рдЗрдВрдбреЗрдХреНрд╕ рд░рдЦреЗрдВ рддрд╛рдХрд┐ тАЬрдХреМрди рдЗрд╕ рд░реЛ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ?тАЭ рд╡рд╛рд▓реЗ рдЪреЗрдХ рддреЗрдЬрд╝ рд╣реЛрдВред

тАЬрдПрдХ рдореИрдиреЗрдЬрд░ рдЕрдкрдиреЗ рдиреАрдЪреЗ рдХреЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИтАЭ рдХреЛ рдХреИрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдБ?

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдкрд░ EXISTS рдХрд░рдирд╛: рддрдм рдПрдХреНрд╕реЗрд╕ рджреЗрдВ рдЬрдм рд╡реНрдпреВрдЕрд░ рдЯрд╛рд░реНрдЧреЗрдЯ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ ancestor рд╣реЛред рдпрд╣ рд░рд┐рд▓реЗ-рд▓реЗрд╡рд▓ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА (RLS) рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд┐рдпрдо рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рд░ API рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╡рд╣реА рд░рд┐рдХрд░реНрд╕рд┐рд╡ рд▓реЙрдЬрд┐рдХ рджреЛрд╣рд░рд╛рдПред

-- рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкрд░рдорд┐рд╢рди рдЪреЗрдХ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ)
SELECT 1
FROM org_closure c
WHERE c.ancestor_id = :viewer_id
  AND c.descendant_id = :employee_id
LIMIT 1;
рд░рд┐рдЗрдВрдСрд░реНрдЧ рд╣рд┐рд╕реНрдЯреНрд░реА рдФрд░ рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓реНрд╕ рдореИрдВ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реВрдБ?

рдЗрддрд┐рд╣рд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ, рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдЬреЛ рдореИрдиреЗрдЬрд░ рдЪреЗрдВрдЬреЗрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡реА рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореИрдиреЗрдЬрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рджреЗрдВ рдФрд░ рдкрд┐рдЫрд▓рд╛ рд░рд┐рдХреЙрд░реНрдб рдЦреЛ рджреЗрдВред рдЗрд╕рд╕реЗ рдЖрдк рдпрд╣ рдмрддрд╛ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рдЦрд╝рд╛рд╕ рддрд╛рд░реАрдЦ рдкрд░ рдХреМрди рдХрд┐рд╕рдХреЗ рдЕрдзреАрди рдерд╛ рдмрд┐рдирд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПред

Adjacency list рд╕реЗ рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рдореЗрдВ рдмрд┐рдирд╛ рдРрдк рддреЛрдбрд╝реЗ рдореИрдВ рдХреИрд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реВрдБ?

рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ manager_id рдХреЛ рд╕реЛрд░реНрд╕-рдСрдл-рдЯреНрд░реВрде рд░рдЦреЗрдВ, рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ рд╕рд╛рде рдореЗрдВ рдмрдирд╛рдПрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдЯреНрд░реА рд╕реЗ рдХреНрд▓реЛрдЬрд╝рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмреИрдХрдлрд┐рд▓ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рд░реАрдб рдкрд╛рдереНрд╕ рдмрджрд▓реЗрдВ (рдлрд╝рд┐рд▓реНрдЯрд░, рдбреИрд╢рдмреЛрд░реНрдб, рдкрд░рдорд┐рд╢рди рдЪреЗрдХ), рдлрд┐рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рддрдм рд╣реА рд░рд┐рдХрд░реНрд╕рди-рдЖрдзрд╛рд░рд┐рдд рдХреНрд╡реЗрд░реАрдЬ рд░рд┐рдЯрд╛рдпрд░ рдХрд░реЗрдВ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд▓реЗрдВред

рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди
рдХреБрдЫ рдмрдирд╛рдПрдВ рдЕрджреНрднреБрдд

рдлреНрд░реА рдкреНрд▓рд╛рди рдХреЗ рд╕рд╛рде рдРрдкрдорд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рдЬрдм рдЖрдк рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ рддрдм рдЖрдк рдЙрдЪрд┐рдд рд╕рджрд╕реНрдпрддрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ
PostgreSQL рдореЗрдВ рдСрд░реНрдЧ рдЪрд╛рд░реНрдЯ рдореЙрдбрд▓ рдХрд░рдирд╛: рдПрдбрдЬреЗрд╕реЗрдВрд╕реА рд▓рд┐рд╕реНрдЯ рдмрдирд╛рдо рдХреНрд▓реЛрдЬрд╝рд░ рдЯреЗрдмрд▓ | AppMaster