рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдХреНрдпрд╛ рдЖрдкрдиреЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдкреЗрдбрд╝ рдкрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓

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

рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рд╣рдо рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ - рд▓реЗрдЯреНрд░реА рдореЗрдВ рд╡реГрдХреНрд╖ рднрдВрдбрд╛рд░рдг рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВред

рд╕реНрдерд╛рдкрдирд╛


рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреЗрдмрд┐рдпрди рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  1. рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдХреНрд╕реНрд▓-рдХрдВрдЯреНрд░реАрдм рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;
  2. psql -U postgres -d рдбреЗрдЯрд╛рдмреЗрд╕-рдирд╛рдо -1 -f SHAREDIR / contrib / ltree.sql - рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕-рдирд╛рдо рдбреЗрдЯрд╛рдмреЗрд╕ (SHAREDIR - PostgreSQL рд╕рд╛рдЭрд╛ рдбреЗрдЯрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛) рдореЗрдВ рдбрд╛рд▓реЗрдВ
  3. ...
  4. рд▓рд╛рдн!


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг


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

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

рдПрдХ рд▓реЗрдмрд▓ рдкрде 0 рдпрд╛ рдЕрдзрд┐рдХ рд▓реЗрдмрд▓ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЕрд╡рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - lquery ред

Lquery рдХреЗ рдЙрджрд╛рд╣рд░рдг:
  1. рдлреВ - рд▓реЗрдмрд▓ рдкрде рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдмрд┐рд▓реНрдХреБрд▓ рдлреВ рдХреЗ рдмрд░рд╛рдмрд░;
  2. fooред * - рд░рд┐рдХреЙрд░реНрдб рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдмрд▓ рдкрде рдлреВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ;
  3. * .fooред * - рдХреЛрдИ рднреА рд░рд┐рдХреЙрд░реНрдб рдЬрд┐рд╕рдХрд╛ рд▓реЗрдмрд▓ рдкрде рдореЗрдВ рдлреВ рд╣реИред


Lquery рд╕рдВрд╢реЛрдзрдХ:
  1. {{n} - рдкрде рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ n рд▓реЗрдмрд▓ рд╣реИрдВ;
  2. {{n,} - рдкрде рдореЗрдВ рдХрдо рд╕реЗ рдХрдо n рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ;
  3. {{n, m} - рдкрде рдореЗрдВ n рд╕реЗ m рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ;
  4. {{, m} - рдкрде рдореЗрдВ m рдЯреИрдЧ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрдХ рд╣реИрдВ:
  1. foo * - foo рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд▓реЗрдмрд▓;
  2. foo @ - рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд▓реЗрдмрд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдлреВ, FOO, FoO - рдХрд░реЗрдВрдЧреЗ;
  3. foo% - foo_bar рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди foo рдФрд░ foobar рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рд╕рдВрд╢реЛрдзрдХ рд╕рдВрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

ltree рдХреА рддреБрд▓рдирд╛ рд╕реНрд╡рдпрдВ рдФрд░ c lquery рдХреЗ рдмреАрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдорд╛рдирдХ рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди =, <>,>, <,> =, <= рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЙрдирдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рдФрд░ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдереЗ:
  1. ltree @> ltree - рдХреНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдмрд╛рдпрд╛рдБ рд╕рджрд╕реНрдп рджрд╛рдИрдВ рдУрд░ рдХрд╛ рдкреВрд░реНрд╡рдЬ рд╣реИ;
  2. ltree <@ ltree - рдХреНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдмрд╛рдпрд╛рдБ рд╕рджрд╕реНрдп рджрд╛рдИрдВ рдУрд░ рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ;
  3. ltree ~ lquery рдпрд╛ lquery ~ ltree - рдХреНрдпрд╛ ltree рдХреНрд╡реЗрд░реА рдореЗрдВ lquery рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред


рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ [2] рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рд╣рдордиреЗ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реАрдЦрд╛ред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рд╣рдореЗрдВ рдЗрд╕ рд░реВрдк рдореЗрдВ рдХреНрд╖реЗрддреНрд░реАрдп рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рд╕рд╛рдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ: рджреЗрд╢ - рдХреНрд╖реЗрддреНрд░ - рд╢рд╣рд░ред

рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
create table "world" ( "id" serial primary key, "name" varchar(150) not null, "tree" ltree not null ); 

рдбреЗрдЯрд╛ рднрд░реЗрдВ:
  id | name | tree ----+----------------+------- 1 |  | 1 2 |  | 2 3 |  | 3 4 |  | 1.4 5 |  | 1.4.5 6 |  | 1.4.6 

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдПрдБ:
 select "id", "name" from "world" where "tree" ~ '*{1}' 

рд░реВрд╕ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
 select "id", "name" from "world" where "tree" ~ '1.*{1}' 

рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ ltree рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рджреВрд░ рдХреА рд╕реВрдЪреА рджреА рд╣реИред рдЕрдиреБрдХреНрд░рдордг, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд▓реЗрдЯреЗрдХреНрд╕рдХреНрд╡реЗрд░реА рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдореБрджреНрджрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ [1, 2]ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, PostgreSQL рдХреЗ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧреА рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ [3]ред рдЕрдЪреНрдЫрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ!

рд╕рдВрджрд░реНрдн


  1. рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ ltree рдХрд╛ рд╡рд┐рд╡рд░рдг
  2. PostgreSQL ltree рд╡рд┐рд╡рд░рдг
  3. PostgreSQL рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдореЙрдбреНрдпреВрд▓

Source: https://habr.com/ru/post/In130371/


All Articles