PostgreSQL рдорд╛ JSONB рд╕рдБрдЧ EAV рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ

TL; DR: JSONB рд▓реЗ рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдХреЛ рддреНрдпрд╛рдЧ рдирдЧрд░реА рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реНрдХрд┐рдорд╛ рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рдзреЗрд░реИ рд╕рд░рд▓ рдмрдирд╛рдЙрди рд╕рдХреНрдЫред

рдкрд░рд┐рдЪрдп

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

рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ рднрдиреЗрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдореВрд▓реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдПрдЙрдЯрд╛ рд╕реНрддрдореНрдн рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рд╣реЛ, рд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдХрд╛рдИ рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗрд╣рд░реВрд▓рд╛рдИ рднрд░реНрдиреБрд╣реЛрд╕реНред рдорд╣рд╛рди! рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рднрдпреЛ... рддрдкрд╛рдИрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд▓рд╛рдЦреМрдВ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдирднрдПрд╕рдореНрдо рд░ рддрдкрд╛рдИрд▓реЗ рдирдпрд╛рдБ рд░реЗрдХрд░реНрдб рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

EAV рдврд╛рдБрдЪрд╛рд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдирд┐рдХрд╛рдп-рд╡рд┐рд╢реЗрд╖рддрд╛-рдорд╛рди), рдпреЛ рдзреЗрд░реИ рдкрдЯрдХ рд╣реБрдиреНрдЫред рдПрдЙрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рд╕рдВрд╕реНрдерд╛рд╣рд░реВ (рд░реЗрдХрд░реНрдбрд╣рд░реВ) рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЕрд░реНрдХреЛ рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рд╕рдореНрдкрддреНрддрд┐ рдирд╛рдорд╣рд░реВ (рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ) рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рд░ рддреЗрд╕реНрд░реЛ рддрд╛рд▓рд┐рдХрд╛рд▓реЗ рд╕рдВрд╕реНрдерд╛рд╣рд░реВрд▓рд╛рдИ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрджреНрдз рдЧрд░реНрджрдЫ рд░ рд╣рд╛рд▓рдХреЛ рд╕рдВрд╕реНрдерд╛рдХреЛ рд▓рд╛рдЧрд┐ рддреА рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВрдХреЛ рдореВрд▓реНрдп рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЧреБрдгрд╣рд░реВрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯрд╣рд░реВ рд░рд╛рдЦреНрдиреЗ рдХреНрд╖рдорддрд╛ рджрд┐рдиреНрдЫ, рд░ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирдЧрд░рд┐рдХрди рдлреНрд▓рд╛рдИрдорд╛ рдЧреБрдгрд╣рд░реВ рдердкреНрди рд╕рдХреНрдЫред

рдпрджреНрдпрдкрд┐, рдпрджрд┐ EVA рджреГрд╖реНрдЯрд┐рдХреЛрдгрдорд╛ рдХреЗрд╣реА рдбрд╛рдЙрдирд╕рд╛рдЗрдбрд╣рд░реВ рдирднрдПрдХреЛ рднрдП рдо рдпреЛ рдкреЛрд╕реНрдЯ рд▓реЗрдЦреНрдиреЗ рдЫреИрдиред рддреНрдпрд╕реЛрднрдП, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреНрд░рддреНрдпреЗрдХ 1 рд╡рд┐рд╢реЗрд╖рддрд╛ рднрдПрдХреЛ рдПрдХ рд╡рд╛ рдмрдвреА рд╕рдВрд╕реНрдерд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди, рдХреНрд╡реЗрд░реАрдорд╛ 2 рдЬреЛрдбрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреН: рдкрд╣рд┐рд▓реЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрд╛рд▓рд┐рдХрд╛рд╕рдБрдЧ рдЬреЛрдбрд┐рдПрдХреЛ рд╣реЛ, рджреЛрд╕реНрд░реЛ рдорд╛рди рддрд╛рд▓рд┐рдХрд╛рд╕рдБрдЧ рдЬреЛрдбрд┐рдПрдХреЛ рд╣реЛред рдпрджрд┐ рдПрдХ рдЗрдХрд╛рдИрдорд╛ 2 рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ 4 рдЬреЛрдбрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреН! рдердк рд░реВрдкрдорд╛, рд╕рдмреИ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ, рдЬрд╕рд▓реЗ рдкрд░рд┐рдгрд╛рдо рд░ WHERE рдХреНрд▓рдЬ рджреБрд╡реИрдХреЛ рд▓рд╛рдЧрд┐ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдЩрдорд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдзреЗрд░реИ рдкреНрд░рд╢реНрдирд╣рд░реВ рд▓реЗрдЦреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдзреЗрд░реИ рдмреЗрдХрд╛рд░ рд╣реЛред

рдпреА рд╕реНрдкрд╖реНрдЯ рдХрдордЬреЛрд░реАрд╣рд░реВрдХреЛ рдмрд╛рд╡рдЬреБрдж, EAV рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рдпреА рдкреНрд░рдХрд╛рд░рдХрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреА рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдХрдордЬреЛрд░реАрд╣рд░реВ рдерд┐рдП, рд░ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рд░рд╛рдореНрд░реЛ рд╡рд┐рдХрд▓реНрдк рдерд┐рдПрдиред
рддрд░ рддреНрдпрд╕рдкрдЫрд┐ PostgreSQL рдорд╛ рдирдпрд╛рдБ "рдкреНрд░рд╡рд┐рдзрд┐" рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ ...

PostgreSQL 9.4 рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ, JSON рдмрд╛рдЗрдирд░реА рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди JSONB рдбрд╛рдЯрд╛ рдкреНрд░рдХрд╛рд░ рдердкрд┐рдпреЛред рдпрджреНрдпрдкрд┐ рдпреЛ рдврд╛рдБрдЪрд╛рдорд╛ JSON рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╕рд╛рджрд╛ рдкрд╛рда JSON рднрдиреНрджрд╛ рдЕрд▓рд┐ рдмрдвреА рдард╛рдЙрдБ рд░ рд╕рдордп рд▓рд┐рдиреНрдЫ, рдпрд╕рдорд╛ рд╕рдЮреНрдЪрд╛рд▓рдирд╣рд░реВ рдзреЗрд░реИ рдЫрд┐рдЯреЛ рд╣реБрдиреНрдЫред JSONB рд▓реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд▓рд╛рдИ рдкрдирд┐ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ рдкреНрд░рд╢реНрдирд╣рд░реВрд▓рд╛рдИ рдЕрдЭ рдЫрд┐рдЯреЛ рдмрдирд╛рдЙрдБрдЫред

JSONB рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдЗрдХрд╛рдИ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреЗрд╡рд▓ рдПрдЙрдЯрд╛ JSONB рд╕реНрддрдореНрдн рдердкреЗрд░ рдЬрдЯрд┐рд▓ EAV рдврд╛рдБрдЪрд╛ рдмрджрд▓реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рдбрд╛рдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╛рдЗрдирд▓рд╛рдИ рдзреЗрд░реИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрджреИред рддрд░ рдзреЗрд░реИрдХреЛ рддрд░реНрдХ рдЫ рдХрд┐ рдпреЛ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдорд╛ рдХрдореА рд╕рдВрдЧ рд╣реБрдиреБ рдкрд░реНрдЫ ... рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдпреЛ рд▓реЗрдЦ рд▓реЗрдЦреЗред

рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рдпрд╕ рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ $9.5 рдмрд┐рд▓реНрдбрдорд╛ PostgreSQL 80 рдХреЛ рдирдпрд╛рдБ рд╕реНрдерд╛рдкрдирд╛рдорд╛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдВред рдбрд┐рдЬрд┐рдЯрд▓ рдУрд╕рди Ubuntu 14.04ред postgresql.conf рдорд╛ рдХреЗрд╣реА рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реЗрдкрдЫрд┐ рдо рджреМрдбреЗрдВ рдпреЛ psql рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд┐рдкрд┐ред рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ EAV рдлрд╛рд░рдордорд╛ рдбрд╛рдЯрд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ:

CREATE TABLE entity ( 
  id           SERIAL PRIMARY KEY, 
  name         TEXT, 
  description  TEXT
);
CREATE TABLE entity_attribute (
  id          SERIAL PRIMARY KEY, 
  name        TEXT
);
CREATE TABLE entity_attribute_value (
  id                  SERIAL PRIMARY KEY, 
  entity_id           INT    REFERENCES entity(id), 
  entity_attribute_id INT    REFERENCES entity_attribute(id), 
  value               TEXT
);

рддрд▓ рдПрдЙрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдЫ рдЬрд╣рд╛рдБ рд╕рдорд╛рди рдбреЗрдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫ, рддрд░ JSONB рдкреНрд░рдХрд╛рд░рдХреЛ рд╕реНрддрдореНрднрдорд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВрд╕рдБрдЧ - рдЧреБрдг.

CREATE TABLE entity_jsonb (
  id          SERIAL PRIMARY KEY, 
  name        TEXT, 
  description TEXT,
  properties  JSONB
);

рдзреЗрд░реИ рд╕рд░рд▓ рджреЗрдЦрд┐рдиреНрдЫ, рд╣реИрди? рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рдЗрдХрд╛рдИ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рдердкрд┐рдпреЛ (рдПрдХрд╛рдЗ & entity_jsonb) 10 рдорд┐рд▓рд┐рдпрди рд░реЗрдХрд░реНрдбрд╣рд░реВ, рд░ рддрджрдиреБрд╕рд╛рд░, рддрд╛рд▓рд┐рдХрд╛ EAV рдврд╛рдБрдЪрд╛ рд░ JSONB рд╕реНрддрдореНрднрдХреЛ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд╕рдорд╛рди рдбреЗрдЯрд╛рд▓реЗ рднрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ - entity_jsonb.propertiesред рдпрд╕рд░реА, рд╣рд╛рдореАрд▓реЗ рдЧреБрдгрд╣рд░реВрдХреЛ рд╕рдореНрдкреВрд░реНрдг рд╕реЗрдЯрдорд╛ рдзреЗрд░реИ рдлрд░рдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдпреМрдВред рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛:

{
  id:          1
  name:        "Entity1"
  description: "Test entity no. 1"
  properties:  {
    color:        "red"
    lenght:       120
    width:        3.1882420
    hassomething: true
    country:      "Belgium"
  } 
}

рддреНрдпрд╕реЛрднрдП рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рджреБрдмреИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рдбрд╛рдЯрд╛ рдЫред рдХрд╛рдордорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реМрдВ!

рдЖрдлреНрдиреЛ рдбрд┐рдЬрд╛рдЗрди рд╕рд░рд▓ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН

рдпреЛ рдкрд╣рд┐рд▓реЗ рднрдирд┐рдПрдХреЛ рдерд┐рдпреЛ рдХрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдзреЗрд░реИ рд╕рд░рд▓реАрдХреГрдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ: EAV рдХреЛ рд▓рд╛рдЧрд┐ рддреАрди рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ рдЧреБрдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ JSONB рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдЙрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ред рддрд░ рдпреЛ рдХрд╕рд░реА рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рд╣реБрдиреНрдЫ? рдПрдЙрдЯрд╛ рд╕рдВрд╕реНрдерд╛рдХреЛ рд╕рдореНрдкрддреНрддрд┐ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрджрд╛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

-- EAV
UPDATE entity_attribute_value 
SET value = 'blue' 
WHERE entity_attribute_id = 1 
  AND entity_id = 120;

-- JSONB
UPDATE entity_jsonb 
SET properties = jsonb_set(properties, '{"color"}', '"blue"') 
WHERE id = 120;

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЕрдиреНрддрд┐рдо рдЕрдиреБрд░реЛрдз рд╕рд░рд▓ рджреЗрдЦрд┐рджреИрдиред JSONB рд╡рд╕реНрддреБрдорд╛ рдЧреБрдгрдХреЛ рдореВрд▓реНрдп рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ jsonb_set(), рд░ JSONB рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдореНрд░реЛ рдирдпрд╛рдБ рдорд╛рди рдкрд╛рд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпрджреНрдпрдкрд┐, рд╣рд╛рдореАрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рдерд╛рд╣рд╛ рдкрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред EAV рдЙрджрд╛рд╣рд░рдг рд╣реЗрд░реНрджреИ, рд╣рд╛рдореАрд▓реЗ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ entity_id рд░ entity_attribute_id рджреБрд╡реИ рдЬрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╡рд╕реНрддреБрдХреЛ рдирд╛рдордорд╛ рдЖрдзрд╛рд░рд┐рдд JSONB рд╕реНрддрдореНрднрдорд╛ рд╕рдореНрдкрддреНрддрд┐ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рд╕рдмреИ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реЗрдЦрд╛рдорд╛ рдЧрд░рд┐рдиреНрдЫред

рдЕрдм рд╣рд╛рдореАрд▓реЗ рднрд░реНрдЦрд░реИ рдпрд╕рдХреЛ рдирдпрд╛рдБ рд░рдВрдЧрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реЗрдХреЛ рдЗрдХрд╛рдИ рдЪрдпрди рдЧрд░реМрдВ:

-- EAV
SELECT e.name 
FROM entity e 
  INNER JOIN entity_attribute_value eav ON e.id = eav.entity_id
  INNER JOIN entity_attribute ea ON eav.entity_attribute_id = ea.id
WHERE ea.name = 'color' AND eav.value = 'blue';

-- JSONB
SELECT name 
FROM entity_jsonb 
WHERE properties ->> 'color' = 'blue';

рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдХрд┐ рд╣рд╛рдореА рд╕рд╣рдордд рд╣реБрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рджреЛрд╕реНрд░реЛ рдЫреЛрдЯреЛ рдЫ (рд╕рд╛рдореЗрд▓ рдЫреИрди!), рд░ рддреНрдпрд╕реИрд▓реЗ рдЕрдзрд┐рдХ рдкрдвреНрди рдпреЛрдЧреНрдпред JSONB рдпрд╣рд╛рдБ рдЬрд┐рддреНрдЫ! рд╣рд╛рдореА JSONB рд╡рд╕реНрддреБрдмрд╛рдЯ рдкрд╛рда рдорд╛рдирдХреЛ рд░реВрдкрдорд╛ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди JSON ->> рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред @> рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JSONB рдореЛрдбреЗрд▓рдорд╛ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рджреЛрд╕реНрд░реЛ рддрд░рд┐рдХрд╛ рдкрдирд┐ рдЫ:

-- JSONB 
SELECT name 
FROM entity_jsonb 
WHERE properties @> '{"color": "blue"}';

рдпреЛ рдЕрд▓рд┐ рдмрдвреА рдЬрдЯрд┐рд▓ рдЫ: рд╣рд╛рдореА рдпрд╕рдХреЛ рдЧреБрдг рд╕реНрддрдореНрднрдорд╛ JSON рд╡рд╕реНрддреБ @> рдЕрдкрд░реЗрдЯрд░рдХреЛ рджрд╛рдБрдпрд╛рдорд╛ рд░рд╣реЗрдХреЛ рд╡рд╕реНрддреБ рд╕рдорд╛рд╡реЗрд╢ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВред рдХрдо рдкрдвреНрди рдпреЛрдЧреНрдп, рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ (рддрд▓ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН)ред

рддрдкрд╛рдИрд▓рд╛рдИ рдПрдХреИ рдкрдЯрдХ рдзреЗрд░реИ рдЧреБрдгрд╣рд░реВ рдЪрдпрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдБрджрд╛ JSONB рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдЭ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реНред рдпреЛ рдЬрд╣рд╛рдБ JSONB рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рдБрдЪреНрдЪреИ рдЖрдЙрдБрдЫ: рд╣рд╛рдореА рдХреЗрд╡рд▓ рдЬреЛрдбрд╣рд░реВрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд┐рдирд╛ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯрдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрдореНрднрд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдЧреБрдгрд╣рд░реВ рдЪрдпрди рдЧрд░реНрдЫреМрдВ:

-- JSONB 
SELECT name
  , properties ->> 'color'
  , properties ->> 'country'
FROM entity_jsonb 
WHERE id = 120;

EAV рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрд▓реЗ рдХреНрд╡реЗрд░реА рдЧрд░реНрди рдЪрд╛рд╣рдиреБ рднрдПрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореНрдкрддреНрддреАрдХреЛ рд▓рд╛рдЧрд┐ 2 рдЬреЛрдбрд┐рди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдорд╛рдерд┐рдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╛рдЗрдирдорд╛ рдареВрд▓реЛ рд╕рд░рд▓реАрдХрд░рдг рджреЗрдЦрд╛рдЙрдБрджрдЫред JSONB рдкреНрд░рд╢реНрдирд╣рд░реВ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдердк рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН, рдпрд╕рдорд╛ рдкрдирд┐ рдпреЛ рдкреЛрд╕реНрдЯред
рдЕрдм рдкреНрд░рджрд░реНрд╢рдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗ рдкрд╛рд▓реЛ рд╣реЛред

рдЙрддреНрдкрд╛рджрдХрддрд╛

рдкреНрд░рджрд░реНрд╢рди рддреБрд▓рдирд╛ рдЧрд░реНрди рдореИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкреНрд░рд╢реНрдирд╣рд░реВрдорд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп рдЧрдгрдирд╛ рдЧрд░реНрдиред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдХрдореНрддрд┐рдорд╛ рддреАрди рдкрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рдХрд┐рдирднрдиреЗ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдХрд╛рд░рд▓реЗ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдзреЗрд░реИ рд╕рдордп рд▓рд┐рдиреНрдЫред рдкрд╣рд┐рд▓реЗ рдореИрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмрд┐рдирд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЪрд▓рд╛рдПрдБред рдЬрд╛рд╣рд┐рд░ рдЫ, рдпреЛ JSONB рдХреЛ рдПрдХ рдлрд╛рдЗрджрд╛ рдерд┐рдпреЛ, рдХрд┐рдирдХрд┐ EAV рдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЬреЛрдЗрдирд╣рд░реВрд▓реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрджреИрди (рд╡рд┐рджреЗрд╢реА рдХреБрдЮреНрдЬреА рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдерд┐рдПрдирдиреН)ред рдпрд╕ рдкрдЫрд┐ рдореИрд▓реЗ EAV рдорд╛рди рддрд╛рд▓рд┐рдХрд╛рдХреЛ 2 рд╡рд┐рджреЗрд╢реА рдХреБрдЮреНрдЬреА рд╕реНрддрдореНрднрд╣рд░реВрдорд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдВ, рд╕рд╛рдереИ рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЬрд┐рди JSONB рд╕реНрддрдореНрднрдХреЛ рд▓рд╛рдЧрд┐ред

рдбрд╛рдЯрд╛ рдЕрдкрдбреЗрдЯрд▓реЗ рд╕рдордпрдХреЛ рд╕рд░реНрддрдорд╛ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рджреЗрдЦрд╛рдПрдХреЛ рдЫ (ms рдорд╛)ред рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╕реНрдХреЗрд▓ рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рд╣реЛ:

PostgreSQL рдорд╛ JSONB рд╕рдБрдЧ EAV рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ

рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреНрдЫреМрдВ рдХрд┐ JSONB EAV рднрдиреНрджрд╛ рдзреЗрд░реИ (> 50000-x) рдЫрд┐рдЯреЛ рдЫ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрднрдПрди рднрдиреЗ, рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ рдХрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ред рдЬрдм рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдЮреНрдЬреАрд╣рд░реВрд╕рдБрдЧ рд╕реНрддрдореНрднрд╣рд░реВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЧрд░реНрдЫреМрдВ, рднрд┐рдиреНрдирддрд╛ рд▓рдЧрднрдЧ рдЧрд╛рдпрдм рд╣реБрдиреНрдЫ, рддрд░ JSONB рдЕрдЭреИ рдкрдирд┐ EAV рднрдиреНрджрд╛ 1,3 рдЧреБрдгрд╛ рдЫрд┐рдЯреЛ рдЫред рд╣рд╛рдореАрд▓реЗ рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдорд╛рдкрджрдгреНрдбрдорд╛ рд╕рдореНрдкрддреНрддрд┐ рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдирдЧрд░реЗрдХрд╛рд▓реЗ JSONB рд╕реНрддрдореНрднрдорд╛ рднрдПрдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рдпрд╣рд╛рдБ рдХреБрдиреИ рдкреНрд░рднрд╛рд╡ рдЫреИрди рднрдиреНрдиреЗ рдХреБрд░рд╛ рдпрд╛рдж рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рдореНрдкрддреНрддрд┐ рдореВрд▓реНрдпрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдЪрдпрди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдорд╣рд░реВ (рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрди) рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ:

PostgreSQL рдорд╛ JSONB рд╕рдБрдЧ EAV рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ JSONB рдлреЗрд░рд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмрд┐рдирд╛ EAV рднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ рдЬрдм EAV рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрд╕рдБрдЧ, рдпреЛ рдЕрдЭреИ рдкрдирд┐ JSONB рднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрджрдЫред рддрд░ рддреНрдпрд╕рдкрдЫрд┐ рдореИрд▓реЗ рджреЗрдЦреЗ рдХрд┐ JSONB рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдордп рдЙрд╕реНрддреИ рдерд┐рдпреЛ, рдпрд╕рд▓реЗ рдорд▓рд╛рдИ GIN рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрд▓реЗ рдХрд╛рдо рдЧрд░реНрджреИрди рднрдиреНрдиреЗ рддрдереНрдпрд▓рд╛рдИ рдкреНрд░реЗрд░рд┐рдд рдЧрд░реНтАНрдпреЛред рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдЬрдм рддрдкрд╛рдЗрдБ рдЖрдмрд╛рджреА рднрдПрдХрд╛ рдЧреБрдгрд╣рд░реВ рднрдПрдХреЛ рд╕реНрддрдореНрднрдорд╛ GIN рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рдпрд╕рд▓реЗ рд╕рдорд╛рд╡реЗрд╢ рдЕрдкрд░реЗрдЯрд░ @> рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ рдорд╛рддреНрд░ рдкреНрд░рднрд╛рд╡ рдкрд╛рд░реНрдЫред рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдирдпрд╛рдБ рдкрд░реАрдХреНрд╖рдгрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ рд░ рдпрд╕рд▓реЗ рд╕рдордпрдорд╛ рдареВрд▓реЛ рдкреНрд░рднрд╛рд╡ рдкрд╛рд░реЗрдХреЛ рдерд┐рдпреЛ: рдХреЗрд╡рд▓ реж.резрелрейms! рдпреЛ EAV рднрдиреНрджрд╛ 0,153 рдЧреБрдгрд╛ рдЫрд┐рдЯреЛ рд░ ->> рдЕрдкрд░реЗрдЯрд░ рднрдиреНрджрд╛ 15000 рдЧреБрдгрд╛ рдЫрд┐рдЯреЛ рдЫред

рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдХрд┐ рдпреЛ рдкрд░реНрдпрд╛рдкреНрдд рдЫрд┐рдЯреЛ рдерд┐рдпреЛ!

рдбрд╛рдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдЖрдХрд╛рд░

рджреБрд╡реИ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХрд╛ рд▓рд╛рдЧрд┐ рддрд╛рд▓рд┐рдХрд╛ рдЖрдХрд╛рд░рд╣рд░реВ рддреБрд▓рдирд╛ рдЧрд░реМрдВред psql рдорд╛ рд╣рд╛рдореА рдХрдорд╛рдгреНрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдмреИ рддрд╛рд▓рд┐рдХрд╛ рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрдХреЛ рдЖрдХрд╛рд░ рджреЗрдЦрд╛рдЙрди рд╕рдХреНрдЫреМрдВ dti+

PostgreSQL рдорд╛ JSONB рд╕рдБрдЧ EAV рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ

EAV рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рд▓рд╛рдЧрд┐, рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЖрдХрд╛рд░рд╣рд░реВ рд▓рдЧрднрдЧ 3068 MB рдЫрдиреН рд░ рдХреБрд▓ 3427 GB рдХреЛ рд▓рд╛рдЧрд┐ 6,43 MB рд╕рдореНрдо рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдЫрдиреНред JSONB рджреГрд╖реНрдЯрд┐рдХреЛрдгрд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд▓рд╛рдЧрд┐ 1817 MB рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ 318 MB рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЬреБрди 2,08 GB рд╣реЛред рдпреЛ 3 рдкрдЯрдХ рдХрдо рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ! рдпреЛ рддрдереНрдпрд▓реЗ рдорд▓рд╛рдИ рдЕрд▓рд┐рдХрддрд┐ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рддреБрд▓реНрдпрд╛рдпреЛ рдХрд┐рдирднрдиреЗ рд╣рд╛рдореА рдкреНрд░рддреНрдпреЗрдХ JSONB рд╡рд╕реНрддреБрдорд╛ рд╕рдореНрдкрддреНрддрд┐ рдирд╛рдорд╣рд░реВ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдЫреМрдВред

рддрд░ рдЕрдЭреИ, рд╕рдВрдЦреНрдпрд╛рд╣рд░реВ рдЖрдлреИрдВрдХреЛ рд▓рд╛рдЧрд┐ рдмреЛрд▓реНрдЫрдиреН: EAV рдорд╛ рд╣рд╛рдореА рдкреНрд░рддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди 2 рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдЮреНрдЬреАрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫреМрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдердк рдбреЗрдЯрд╛рдХреЛ 8 рдмрд╛рдЗрдЯрд╣рд░реВред рдердк рд░реВрдкрдорд╛, EAV рд▓реЗ рд╕рдмреИ рд╕рдореНрдкрддреНрддрд┐ рдорд╛рдирд╣рд░реВрд▓рд╛рдИ рдкрд╛рдардХреЛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрджрдЫ, рдЬрдмрдХрд┐ JSONB рд▓реЗ рд╕рдореНрднрд╡ рднрдПрд╕рдореНрдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░ рдмреБрд▓рд┐рдпрди рдорд╛рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд╛рдиреЛ рдкрджрдЪрд┐рд╣реНрдиред

рдкрд░рд┐рдгрд╛рдорд╣рд░реВ

рд╕рдордЧреНрд░рдорд╛, рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдХрд┐ JSONB рдврд╛рдБрдЪрд╛рдорд╛ рдЗрдХрд╛рдИ рдЧреБрдгрд╣рд░реВ рдмрдЪрдд рдЧрд░реНрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдбрд╛рдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╛рдЗрди рд░ рдорд░реНрдордд рдЧрд░реНрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрди рд╕рдХреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдзреЗрд░реИ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЪрд▓рд╛рдЗрд░рд╣рдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рддрдм рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдПрдЙрдЯреИ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд░рд╛рдЦреЗрд░ рд╕рдВрд╕реНрдерд╛рд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдЕрдЭ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред рд░ рддрдереНрдп рдпреЛ рдЫ рдХрд┐ рдпрд╕рд▓реЗ рдбреЗрдЯрд╛ рдмреАрдЪрдХреЛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫ рдкрд╣рд┐рд▓реЗ рдиреИ рдПрдХ рдкреНрд▓рд╕ рд╣реЛ, рддрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбрд╛рдЯрд╛рдмреЗрд╕ рднреЛрд▓реНрдпреБрдордорд╛ 3 рдЧреБрдгрд╛ рд╕рд╛рдиреЛ рдЫред

рд╕рд╛рдереИ, рдЧрд░рд┐рдПрдХрд╛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рдЖрдзрд╛рд░рдорд╛, рд╣рд╛рдореА рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдкреБрдЧреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╣рд╛рдирд┐рд╣рд░реВ рдзреЗрд░реИ рдирдЧрдгреНрдп рдЫрдиреНред рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛, JSONB EAV рднрдиреНрджрд╛ рдкрдирд┐ рдЫрд┐рдЯреЛ рдЫ, рдпрд╕рд▓рд╛рдИ рдЕрдЭ рд░рд╛рдореНрд░реЛ рдмрдирд╛рдЙрдБрдЫред рдпрджреНрдпрдкрд┐, рдпреЛ рдмреЗрдиреНрдЪрдорд╛рд░реНрдХрд▓реЗ рдкрдХреНрдХреИ рдкрдирд┐ рд╕рдмреИ рдкрдХреНрд╖рд╣рд░реВрд▓рд╛рдИ рд╕рдореЗрдЯреНрджреИрди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЧреБрдг рднрдПрдХрд╛ рд╕рдВрд╕реНрдерд╛рд╣рд░реВ, рдЕрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛рдХреЛ рдЧреБрдгрд╣рд░реВрдХреЛ рд╕рдЩреНрдЦреНрдпрд╛рдорд╛ рднрдПрдХреЛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐,...), рддреНрдпрд╕реИрд▓реЗ рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрдиреИ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЫрдиреН рднрдиреЗред , рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рдЫреЛрдбреНрди рдирд╣рд┐рдЪрдХрд┐рдЪрд╛рдЙрдиреБрд╣реЛрд╕реН!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди