рдЯреАрдПрд▓; DR: JSONB рдХреНрд╡реЗрд░реА рдХрд╛рдордЧрд┐рд░реАрдЪрд╛ рддреНрдпрд╛рдЧ рди рдХрд░рддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рд╡рд┐рдХрд╛рд╕ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕реБрд▓рдн рдХрд░реВ рд╢рдХрддреЗ.
рдкрд░рд┐рдЪрдп
рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ (рдбреЗрдЯрд╛рдмреЗрд╕) рдЪреНрдпрд╛ рдЬрдЧрд╛рддреАрд▓ рд╕рд░реНрд╡рд╛рдд рдЬреБрдиреНрдпрд╛ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдгрд╛рдВрдкреИрдХреА рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджреЗрдК: рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдШрдЯрдХрд╛рдЪреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгрдзрд░реНрдо (рд╡рд┐рд╢реЗрд╖рддрд╛) рдЬрддрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкрд░рдВрддреБ рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рдЧреБрдгрдзрд░реНрдорд╛рдВрдЪрд╛ рдПрдХрдЪ рд╕рдВрдЪ рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдд рдЖрдгрдЦреА рдЧреБрдгрдзрд░реНрдо рдЬреЛрдбрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд▓рдорддреНрддрд╛ рдореВрд▓реНрдпрд╛рд╕рд╛рдареА рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдПрдХ рд╕реНрддрдВрдн рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реЗ рдлрдХреНрдд рднрд░рдгреЗ. рдЫрд╛рди! рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рд▓реА... рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдордЪреНрдпрд╛ рдЯреЗрдмрд▓рдордзреНрдпреЗ рд▓рд╛рдЦреЛ рд░реЗрдХреЙрд░реНрдбреНрд╕ рдЕрд╕рддреАрд▓ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рд░реЗрдХреЙрд░реНрдб рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.
EAV рдирдореБрдирд╛ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреНрдпрд╛ (), рд╣реЗ рдмрд▒реНрдпрд╛рдЪрджрд╛ рдЙрджреНрднрд╡рддреЗ. рдПрдХрд╛ рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╕рдВрд╕реНрдерд╛ (рд░реЗрдХреЙрд░реНрдб) рдЕрд╕рддрд╛рдд, рджреБрд╕рд▒реНрдпрд╛ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреА рдирд╛рд╡реЗ (рд╡рд┐рд╢реЗрд╖рддрд╛) рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддрд┐рд╕рд▒реНрдпрд╛ рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╕рдВрд╕реНрдерд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рдШрдЯрдХрд╛рд╕рд╛рдареА рддреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдВрдЪреЗ рдореВрд▓реНрдп рдЕрд╕рддреЗ. рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╕реНрддреВрдВрд╕рд╛рдареА рдЧреБрдгрдзрд░реНрдорд╛рдВрдЪреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рд╕рдВрдЪ рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рди рдмрджрд▓рддрд╛ рдлреНрд▓рд╛рдпрд╡рд░ рдЧреБрдгрдзрд░реНрдо рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рджреЗрддреЗ.
рддрдерд╛рдкрд┐, рдЬрд░ рдИрд╡реНрд╣реАрдП рдкрдзреНрджрддреАрдордзреНрдпреЗ рдХрд╛рд╣реА рддреЛрдЯреЗ рдирд╕рддреАрд▓ рддрд░ рдореА рд╣реЗ рдкреЛрд╕реНрдЯ рд▓рд┐рд╣рд┐рдгрд╛рд░ рдирд╛рд╣реА. рдореНрд╣рдгреВрди, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкреНрд░рддреНрдпреЗрдХреА 1 рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХреНрд╡реЗрд░реАрдордзреНрдпреЗ 2 рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рдкреНрд░рдердо рдЧреБрдгрдзрд░реНрдо рд╕рд╛рд░рдгреАрд╕рд╣ рдЬреЛрдбрдгреЗ рдЖрд╣реЗ, рджреБрд╕рд░реЗ рдореВрд▓реНрдп рд╕рд╛рд░рдгреАрд╕рд╣ рдЬреЛрдбрдгреЗ рдЖрд╣реЗ. рдПрдЦрд╛рджреНрдпрд╛ рдШрдЯрдХрд╛рдордзреНрдпреЗ 2 рдЧреБрдгрдзрд░реНрдо рдЕрд╕рд▓реНрдпрд╛рд╕, 4 рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд! рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╕рд░реНрд╡ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореНрд╣рдгреВрди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдЬреНрдпрд╛рдореБрд│реЗ рдкрд░рд┐рдгрд╛рдо рдЖрдгрд┐ WHERE рдХреНрд▓реЙрдЬ рджреЛрдиреНрд╣реАрд╕рд╛рдареА рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╣реЛрддреЗ. рдЬрд░ рддреБрдореНрд╣реА рдЕрдиреЗрдХ рдкреНрд░рд╢реНрди рд▓рд┐рд╣рд┐рдд рдЕрд╕рд╛рд▓, рддрд░ рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рд╣реЗ рдЦреВрдк рд╡реНрдпрд░реНрде рдЖрд╣реЗ.
рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдгреАрд╡рд╛ рдЕрд╕реВрдирд╣реА, рдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА EAV рдЪрд╛ рджреАрд░реНрдШрдХрд╛рд│ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рдд рдЖрд╣реЗ. рдпрд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдЙрдгреАрд╡рд╛ рд╣реЛрддреНрдпрд╛ рдЖрдгрд┐ рдпрд╛рдкреЗрдХреНрд╖рд╛ рдЪрд╛рдВрдЧрд▓рд╛ рдкрд░реНрдпрд╛рдп рдирд╡реНрд╣рддрд╛.
рдкрдг рдирдВрддрд░ PostgreSQL рдордзреНрдпреЗ рдПрдХ рдирд╡реАрди "рддрдВрддреНрд░рдЬреНрдЮрд╛рди" рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ...
PostgreSQL 9.4 рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрди, JSON рдмрд╛рдпрдирд░реА рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА JSONB рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд▓рд╛ рдЧреЗрд▓рд╛. рдЬрд░реА JSON рдпрд╛ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд╕рд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдпрдд: рд╕рд╛рдзреНрдпрд╛ рдордЬрдХреБрд░рд╛рдЪреНрдпрд╛ JSON рдкреЗрдХреНрд╖рд╛ рдереЛрдбреА рдЬрд╛рд╕реНрдд рдЬрд╛рдЧрд╛ рдЖрдгрд┐ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ, рддрд░реАрд╣реА рддреНрдпрд╛рд╡рд░ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреЗ рдЦреВрдк рдЬрд▓рдж рдЖрд╣реЗ. JSONB рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд▓рд╛ рджреЗрдЦреАрд▓ рд╕рдорд░реНрдерди рджреЗрддреЗ, рдЬреЗ рдХреНрд╡реЗрд░реА рдЖрдгрдЦреА рдЬрд▓рдж рдХрд░рддреЗ.
JSONB рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдШрдЯрдХ рд╕рд╛рд░рдгреАрдордзреНрдпреЗ рдлрдХреНрдд рдПрдХ JSONB рд╕реНрддрдВрдн рдЬреЛрдбреВрди рдЕрд╡рдЬрдб EAV рдкреЕрдЯрд░реНрди рдмрджрд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ, рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЭрд╛рдЗрди рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕реБрд▓рдн рдХрд░рддреЛ. рдкрдг рдЕрдиреЗрдХрд╛рдВрдЪрд╛ рдЕрд╕рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЖрд╣реЗ рдХреА рдпрд╛рд╕реЛрдмрдд рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХрдореА рдЭрд╛рд▓реА рдкрд╛рд╣рд┐рдЬреЗ... рдореНрд╣рдгреВрдирдЪ рдореА рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рд▓рд╛ рдЖрд╣реЗ.
рдЪрд╛рдЪрдгреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ
рдпрд╛ рддреБрд▓рдиреЗрд╕рд╛рдареА, рдореА $9.5 рдмрд┐рд▓реНрдбрд╡рд░ PostgreSQL 80 рдЪреНрдпрд╛ рдирд╡реАрди рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рдирд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. Ubuntu резрек.режрек 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"
}
}рддрд░ рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рджреЛрдиреНрд╣реА рдкрд░реНрдпрд╛рдпрд╛рдВрд╕рд╛рдареА рд╕рдорд╛рди рдбреЗрдЯрд╛ рдЖрд╣реЗ. рдЪрд▓рд╛ рдХрд╛рдорд╛рд╡рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рддреБрд▓рдирд╛ рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░реВрдпрд╛!
рддреБрдордЪреА рд░рдЪрдирд╛ рд╕реЛрдкреА рдХрд░рд╛
рдпрд╛рдкреВрд░реНрд╡реА рдЕрд╕реЗ рдирдореВрдж рдХреЗрд▓реЗ рд╣реЛрддреЗ рдХреА рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЭрд╛рдЗрди рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕рд░рд▓реАрдХреГрдд рдХреЗрд▓реЗ рдЖрд╣реЗ: рдПрдХ рдЯреЗрдмрд▓, рдЧреБрдгрдзрд░реНрдорд╛рдВрд╕рд╛рдареА JSONB рд╕реНрддрдВрдн рд╡рд╛рдкрд░реВрди, EAV рд╕рд╛рдареА рддреАрди рдЯреЗрдмрд▓реНрд╕ рд╡рд╛рдкрд░рдгреНрдпрд╛рдРрд╡рдЬреА. рдкрдг рд╣реЗ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдордзреНрдпреЗ рдХрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╣реЛрддреЗ? рдПрдХ рдШрдЯрдХ рдЧреБрдгрдзрд░реНрдо рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреЗ рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддреЗ:
-- 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 рдСрдмреНрдЬреЗрдХреНрдЯ рдореНрд╣рдгреВрди рдкрд╛рд╕ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рддрдерд╛рдкрд┐, рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХрд╛рдЪреА рдЖрдЧрд╛рдК рдорд╛рд╣рд┐рддреА рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА. 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 рдордзреНрдпреЗ) рджрд╛рдЦрд╡рд▓реЗ. рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд╕реНрдХреЗрд▓ рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рдЖрд╣реЗ:

рдЖрдкрдг рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рдЬрд░ рддреБрдореНрд╣реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╡рд╛рдкрд░рдд рдирд╕рд╛рд▓ рддрд░ JSONB рд╣реЗ EAV рдкреЗрдХреНрд╖рд╛ рдХрд┐рддреАрддрд░реА рдЬрд╛рд╕реНрдд (> 50000-x) рд╡реЗрдЧрд╡рд╛рди рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕рддреЗ. рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдкреНрд░рд╛рдердорд┐рдХ рдХреА рд╕рд╣ рд╕реНрддрдВрдн рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреЛ, рддреЗрд╡реНрд╣рд╛ рдлрд░рдХ рдЬрд╡рд│рдЬрд╡рд│ рдирд╛рд╣реАрд╕рд╛ рд╣реЛрддреЛ, рдкрд░рдВрддреБ JSONB рдЕрдЬреВрдирд╣реА EAV рдкреЗрдХреНрд╖рд╛ 1,3 рдкрдЯ рд╡реЗрдЧрд╡рд╛рди рдЖрд╣реЗ. рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдХреА JSONB рд╕реНрддрдВрднрд╛рд╡рд░реАрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдЪрд╛ рдпреЗрдереЗ рдХреЛрдгрддрд╛рд╣реА рдкреНрд░рднрд╛рд╡ рдирд╛рд╣реА рдХрд╛рд░рдг рдЖрдореНрд╣реА рдореВрд▓реНрдпрдорд╛рдкрди рдирд┐рдХрд╖рд╛рдВрдордзреНрдпреЗ рдЧреБрдгрдзрд░реНрдо рд╕реНрддрдВрдн рд╡рд╛рдкрд░рдд рдирд╛рд╣реА.
рдорд╛рд▓рдорддреНрддреЗрдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдкрд░рд┐рдгрд╛рдо рдорд┐рд│рддрд╛рдд (рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдорд╛рдг):

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

EAV рдкрджреНрдзрддреАрд╕рд╛рдареА, рдЯреЗрдмрд▓рдЪрд╛ рдЖрдХрд╛рд░ рд╕реБрдорд╛рд░реЗ 3068 MB рдЖрд╣реЗ рдЖрдгрд┐ рдПрдХреВрдг 3427 GB рд╕рд╛рдареА 6,43 MB рдкрд░реНрдпрдВрдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЖрд╣реЗ. JSONB рджреГрд╖реНрдЯрд┐рдХреЛрди рдЯреЗрдмрд▓рд╕рд╛рдареА 1817 MB рдЖрдгрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрд╕рд╛рдареА 318 MB рд╡рд╛рдкрд░рддреЛ, рдЬреЗ 2,08 GB рдЖрд╣реЗ. рд╣реЗ 3 рд╡реЗрд│рд╛ рдХрдореА рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ! рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдорд▓рд╛ рдереЛрдбреЗ рдЖрд╢реНрдЪрд░реНрдп рд╡рд╛рдЯрд▓реЗ рдХрд╛рд░рдг рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ JSONB рдСрдмреНрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдорд╛рд▓рдорддреНрддреЗрдЪреА рдирд╛рд╡реЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЛ.
рдкрд░рдВрддреБ рддрд░реАрд╣реА, рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡рддрдГрд╕рд╛рдареА рдмреЛрд▓рддрд╛рдд: EAV рдордзреНрдпреЗ рдЖрдореНрд╣реА рдкреНрд░рддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓реНрдп 2 рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рджреЗрд╢реА рдХреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЛ, рдкрд░рд┐рдгрд╛рдореА 8 рдмрд╛рдЗрдЯреНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдорд┐рд│рддреЛ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, EAV рд╕рд░реНрд╡ рдорд╛рд▓рдорддреНрддрд╛ рдореВрд▓реНрдпреЗ рдордЬрдХреВрд░ рдореНрд╣рдгреВрди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ, рддрд░ JSONB рдЕрдВрдХреАрдп рдЖрдгрд┐ рдмреБрд▓рд┐рдпрди рдореВрд▓реНрдпреЗ рдЬреЗрдереЗ рд╢рдХреНрдп рдЕрд╕реЗрд▓ рддреЗрдереЗ рдЕрдВрддрд░реНрдЧрдд рд╡рд╛рдкрд░реЗрд▓, рдкрд░рд┐рдгрд╛рдореА рдПрдХ рд▓рд╣рд╛рди рдлреВрдЯрдкреНрд░рд┐рдВрдЯ рд╣реЛрдИрд▓.
рдкрд░рд┐рдгрд╛рдо
рдПрдХрдВрджрд░реАрдд, рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдЬреЗрдПрд╕рдУрдПрдирдмреА рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдПрдВрдЯрд┐рдЯреА рдЧреБрдгрдзрд░реНрдо рдЬрддрди рдХреЗрд▓реНрдпрд╛рдиреЗ рддреБрдордЪрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЭрд╛рдЗрди рдХрд░рдгреЗ рдЖрдгрд┐ рджреЗрдЦрд░реЗрдЦ рдХрд░рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рд╣реЛрдК рд╢рдХрддреЗ. рддреБрдореНрд╣реА рдкреБрд╖реНрдХрд│ рдХреНрд╡реЗрд░реА рдЪрд╛рд▓рд╡рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рд╕рд░реНрд╡ рдХрд╛рд╣реА рдШрдЯрдХ рд╕рд╛рд░рдгреАрдд рдареЗрд╡рд▓реНрдпрд╛рд╕ рддреЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдХрд╛рд░реНрдп рдХрд░реЗрд▓. рдЖрдгрд┐ рд╣реЗ рдбреЗрдЯрд╛рдордзреАрд▓ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рд╕реБрд▓рдн рдХрд░рддреЗ рд╣реЗ рддрдереНрдп рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдПрдХ рдкреНрд▓рд╕ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрд╣реЙрд▓реНрдпреВрдордордзреНрдпреЗ 3 рдкрдЯ рд▓рд╣рд╛рди рдЖрд╣реЗ.
рддрд╕реЗрдЪ, рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЪрд╛рдЪрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ, рдЖрдореНрд╣реА рдЕрд╕рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛рдвреВ рд╢рдХрддреЛ рдХреА рдХрд╛рдордЧрд┐рд░реАрдЪреЗ рдиреБрдХрд╕рд╛рди рдлрд╛рд░рдЪ рдХреНрд╖реБрд▓реНрд▓рдХ рдЖрд╣реЗ. рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, JSONB EAV рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд╡реЗрдЧрд╡рд╛рди рдЖрд╣реЗ, рддреЗ рдЖрдгрдЦреА рдЪрд╛рдВрдЧрд▓реЗ рдмрдирд╡рддреЗ. рддрдерд╛рдкрд┐, рд╣рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЕрд░реНрдерд╛рддрдЪ рд╕рд░реНрд╡ рдкреИрд▓реВрдВрдЪрд╛ рдЕрдВрддрд░реНрднрд╛рд╡ рдХрд░рдд рдирд╛рд╣реА (рдЙрджрд╛. рдЦреВрдк рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдЧреБрдгрдзрд░реНрдо рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рдВрд╕реНрдерд╛, рд╡рд┐рджреНрдпрдорд╛рди рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдЧреБрдгрдзрд░реНрдорд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдд рд▓рдХреНрд╖рдгреАрдп рд╡рд╛рдв,...), рддреНрдпрд╛рдореБрд│реЗ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рддреНрдпрд╛ рдХрд╢рд╛ рд╕реБрдзрд╛рд░рд╛рдпрдЪреНрдпрд╛ рдпрд╛рдмрджреНрджрд▓ рдХрд╛рд╣реА рд╕реВрдЪрдирд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ , рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдореЛрдХрд│реНрдпрд╛ рдордирд╛рдиреЗ рд╕реЛрдбрд╛!
рд╕реНрддреНрд░реЛрдд: www.habr.com
