PostgreSQL рдореЗрдВ EAV рдХреЛ JSONB рд╕реЗ рдмрджрд▓рдирд╛

рдЯреАрдПрд▓; рдбреЙ: JSONB рдХреНрд╡реЗрд░реА рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

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

рдЗрди рд╕реНрдкрд╖реНрдЯ рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрдПрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд░рд╣рд╛ рд╣реИред рдпреЗ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдХрдорд┐рдпрд╛рдБ рдереАрдВ, рдФрд░ рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛ред
рд▓реЗрдХрд┐рди рдлрд┐рд░ PostgreSQL рдореЗрдВ рдПрдХ рдирдИ "рддрдХрдиреАрдХ" рд╕рд╛рдордиреЗ рдЖрдИ...

PostgreSQL 9.4 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, JSON рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSONB рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ JSON рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рд╕рд╛рджреЗ рдкрд╛рда JSON рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдФрд░ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред JSONB рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд╡реЗрд░реАрдЬрд╝ рдФрд░ рднреА рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

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

рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

рдЗрд╕ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ $9.5 рдмрд┐рд▓реНрдб рдкрд░ PostgreSQL 80 рдХреА рддрд╛рдЬрд╝рд╛ рд╕реНрдерд╛рдкрдирд╛ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ DigitalOcean 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
);

рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдлрд┐рд░ рдЗрд╕реЗ рдЗрдХрд╛рдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ (рд╕рддреНрддрд╛ & рдЗрдХрд╛рдИ_рдЬреЗрдПрд╕рдУрдПрдирдмреА) 10 рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдИрдПрд╡реА рдкреИрдЯрд░реНрди рдФрд░ рдЬреЗрдПрд╕рдУрдПрдирдмреА рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕реЗ рднрд░рд╛ рдЧрдпрд╛ рдерд╛ - рдЗрдХрд╛рдИ_jsonb.рдЧреБрдг. рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдПред рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛:

{
  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 рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдИрдПрд╡реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдХрд╛рдИ_рдЖрдИрдбреА рдФрд░ рдЗрдХрд╛рдИ_рд╡рд┐рд╢реЗрд╖рддрд╛_рдЖрдИрдбреА рджреЛрдиреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ 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;

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

рдирд┐рд╖реНрдкрд╛рджрди

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

рдбреЗрдЯрд╛ рдЕрджреНрдпрддрди рдиреЗ рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ (рдПрдордПрд╕ рдореЗрдВ) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреИрдорд╛рдирд╛ рд▓рдШреБрдЧрдгрдХреАрдп рд╣реИ:

PostgreSQL рдореЗрдВ EAV рдХреЛ JSONB рд╕реЗ рдмрджрд▓рдирд╛

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

рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо (рд╕рд╛рдорд╛рдиреНрдп рдкреИрдорд╛рдиреЗ) рдорд┐рд▓рддреЗ рд╣реИрдВ:

PostgreSQL рдореЗрдВ EAV рдХреЛ JSONB рд╕реЗ рдмрджрд▓рдирд╛

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ JSONB рдлрд┐рд░ рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ EAV рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм EAV рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рддрдм рднреА рдпрд╣ JSONB рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ JSONB рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдордп рд╡рд╣реА рдерд╛, рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдпрд╣ рддрдереНрдп рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ GIN рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдкреЙрдкреБрд▓реЗрдЯреЗрдб рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдкрд░ GIN рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рдСрдкрд░реЗрдЯрд░ @> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рднрд╛рд╡реА рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдирдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕ рд╕рдордп рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рд╛: рдХреЗрд╡рд▓ 0,153 рдПрдордПрд╕! рдпрд╣ рдИрдПрд╡реА рд╕реЗ 15000 рдЧреБрдирд╛ рддреЗрдЬ рдФрд░ ->> рдСрдкрд░реЗрдЯрд░ рд╕реЗ 25000 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рддреЗрдЬрд╝ рдерд╛!

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

рдЖрдЗрдП рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдЖрдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред Psql рдореЗрдВ рд╣рдо рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдбреАрдЯреАрдЖрдИ+

PostgreSQL рдореЗрдВ EAV рдХреЛ JSONB рд╕реЗ рдмрджрд▓рдирд╛

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

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

рдкрд░рд┐рдгрд╛рдо

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

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

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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ ЁЯФе рдбреАрдбреАрдУрдПрд╕ рд╕реБрд░рдХреНрд╖рд╛, рд╡реАрдкреАрдПрд╕ рдФрд░ рд╡реАрдбреАрдПрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ | ProHoster