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 เชจเชพ เชจเชตเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชชเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฌเชจเชพเชตเซเชฏเซ‹ DigitalOcean เช‰เชฌเซเชจเซเชŸเซ 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 เช‡เชจเซเชกเซ‡เช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชซเช•เซเชค เชคเซเชฏเชพเชฐเซ‡ เชœ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชถเชพเชฎเซ‡เชฒ เช“เชชเชฐเซ‡เชŸเชฐ @> เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. เชฎเซ‡เช‚ เช†เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจเชตเชพ เชชเชฐเซ€เช•เซเชทเชฃเชฎเชพเช‚ เช•เชฐเซเชฏเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชฎเชฏ เชชเชฐ เชญเชพเชฐเซ‡ เช…เชธเชฐ เชชเชกเซ€: เชฎเชพเชคเซเชฐ 0,153ms! เช† EAV เช•เชฐเชคเชพเช‚ 15000 เช—เชฃเซ€ เชเชกเชชเซ€ เช…เชจเซ‡ -->> เช“เชชเชฐเซ‡เชŸเชฐ เช•เชฐเชคเชพเช‚ 25000 เช—เชฃเซ€ เชเชกเชชเซ€ เช›เซ‡.

เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชเชกเชชเซ€ เชนเชคเซเช‚!

เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เซ‹เชทเซเชŸเช•เชจเซเช‚ เช•เชฆ

เชšเชพเชฒเซ‹ เชฌเช‚เชจเซ‡ เช…เชญเชฟเช—เชฎเซ‹ เชฎเชพเชŸเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเชพ เช•เชฆเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ€เช. 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹