PostgreSQL рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

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


рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!
рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдмрдВрдзрдкрд░рдХ DBMS рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИред рдЯреЗрдмрд▓ рдХрдВрдЯреЗрдирд░, рдЗрд╕рдХреА рдХрдареЛрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдкрд░ рдХрдИ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдбреЗрдЯрд╛ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Join'ov рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЗрд╡рд▓ рдмрд┐рдЧрдбрд╝рддреА рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ PostgreSQL рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд▓рдЪреАрд▓реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдпрд╣ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ (рд░рд┐рдХреЙрд░реНрдб, рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рджреГрд╢реНрдп рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:

(
table1_column1 int,
table1_column2 varchar,
table1_column3 numeric,
table2_columns t2_columns[]
)


рдЬрд╣рд╛рдБ t2_columns рдлреЙрд░реНрдо рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ
(
table2_column1 double precision,
table2_column2 timestamp
)


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рдХрд░, рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди PL / pgSQL рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдард┐рдд рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХреА рдереАред рджрд░рдЕрд╕рд▓ рдпрд╣ рд▓реЗрдЦ рдХреНрд░рдордмрджреНрдз PostgreSQL рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

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

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

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

рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:
 select to_json( row( 10, 'Some text', 12.5, row( 'text in nested record', array[ 1, 2, 3 ] )::text_and_array, array[ 'array', 'of', 'text' ] ) ) 


рд░рд┐рдЬрд▓реНрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз:
 {"f1":10,"f2":"Some text","f3":12.5,"f4":{"str":"text in nested record","arr":[1,2,3]},"f5":["array","of","text"]} 


рд╣рдо рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:
 select json_agg( q.*, 'json_field_name1' ), json_agg_plain( q.*, 'json_field_name2' ) from ... as q; 


рд░рд┐рдЬрд▓реНрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз:
 {"json_field_name1":[{ ... },{ ... }, ...]} "json_field_name2":[{ ... },{ ... }, ...] 


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

рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ:
  select from_json( 'some_record_type', '{"field1":"some text","field2":123,"field3":["this","is","array","of","text"]}' ); select arr_from_json( 'some_type[]', '[{"this is array of"},{"records with one field"}]' ); 


рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо:
("some text",123,"{\"this\",\"is\",\"array\",\"of\",\"text\"}")

{("this is array of"),("records with one field")}


рд╡рд░реНрдгрд┐рдд рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреВрд▓ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C ++ рдФрд░ PHP) рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд PostgreSQL рдХреЗ рд▓рд┐рдП рддреБрд▓рдиреАрдп рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдВрдХ

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


All Articles