PostgreSQL เจตเจฟเฉฑเจš JSONB เจจเจพเจฒ EAV เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ

TL; DR: JSONB เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉ€ เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจจเฉ‚เฉฐ เจ•เฉเจฐเจฌเจพเจจ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจธเจ•เฉ€เจฎเจพ เจตเจฟเจ•เจพเจธ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจฐเจฒ เจฌเจฃเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจœเจพเจฃ เจชเจ›เจพเจฃ

เจ†เจ‰ เจฐเจฟเจฒเฉ‡เจธเจผเจจเจฒ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ (เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ) เจฆเฉ€ เจฆเฉเจจเฉ€เจ† เจตเจฟเฉฑเจš เจธเจผเจพเจ‡เจฆ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจฃเฉ‡ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจ•เฉ‡เจธเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจฆเฉ€ เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ‡เจˆเจ: เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจ‡เจ•เจพเจˆ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจ‡เจ•เจพเจˆ เจฆเฉ€เจ†เจ‚ เจ•เฉเจ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ (เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚) เจจเฉ‚เฉฐ เจฌเจšเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจชเจฐ เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ•เฉ‹ เจธเฉˆเฉฑเจŸ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจ‡เจธ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจ•เจฟ เจนเจฐเฉ‡เจ• เจธเฉฐเจชเฉฑเจคเฉ€ เจฎเฉเฉฑเจฒ เจฒเจˆ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจฌเจฃเจพเจ‰เจฃเจพ, เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจญเจฐเจจเจพ เจœเฉ‹ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ‡เจ•เจพเจˆ เจฆเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจนเจจเฅค เจฌเจนเฉเจค เจตเจงเฉ€เจ†! เจธเจฎเฉฑเจธเจฟเจ† เจนเฉฑเจฒ เจนเฉ‹ เจ—เจˆ... เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจคเฉเจนเจพเจกเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจฒเฉฑเจ–เจพเจ‚ เจฐเจฟเจ•เจพเจฐเจก เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ‡ เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจก เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

EAV เจชเฉˆเจŸเจฐเจจ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹ (เจนเจธเจคเฉ€-เจ—เฉเจฃ-เจฎเฉเฉฑเจฒ), เจ‡เจน เจ…เจ•เจธเจฐ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจ‡เจ•เจพเจˆเจ†เจ‚ (เจฐเจฟเจ•เจพเจฐเจก), เจฆเฉ‚เจœเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจธเฉฐเจชเฉฑเจคเฉ€ เจฆเฉ‡ เจจเจพเจฎ (เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚) เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจคเฉ€เจœเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจ‡เจ•เจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ—เฉเจฃเจพเจ‚ เจจเจพเจฒ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจนเจธเจคเฉ€ เจฒเจˆ เจ‰เจนเจจเจพเจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเจพ เจฎเฉเฉฑเจฒ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจตเจธเจคเฉ‚เจ†เจ‚ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ‡ เจตเฉฑเจ–เฉ‹-เจตเฉฑเจ–เจฐเฉ‡ เจธเฉˆเฉฑเจŸ เจฐเฉฑเจ–เจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ‡ เจฌเจฟเจจเจพเจ‚ เจซเจฒเจพเจˆ 'เจคเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเฉ€ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเฉˆเจ‚ เจ‡เจน เจชเฉ‹เจธเจŸ เจจเจนเฉ€เจ‚ เจฒเจฟเจ–เจพเจ‚เจ—เจพ เจœเฉ‡เจ•เจฐ เจˆเจตเฉ€เจ เจชเจนเฉเฉฐเจš เจตเจฟเฉฑเจš เจ•เฉเจ เจ•เจฎเฉ€เจ†เจ‚ เจจเจพ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚เฅค เจ‡เจธ เจฒเจˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจœเจพเจ‚ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจ‡เจ•เจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจตเจฟเฉฑเจš 1 เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจนเฉˆ, เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจตเจฟเฉฑเจš 2 เจœเฉ‹เฉœเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ: เจชเจนเจฟเจฒเจพ เจ—เฉเจฃ เจธเจพเจฐเจฃเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเจจเจพ เจนเฉˆ, เจฆเฉ‚เจœเจพ เจฎเฉเฉฑเจฒ เจธเจพเจฐเจฃเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเจจเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ•เจฟเจธเฉ‡ เจ‡เจ•เจพเจˆ เจฆเฉ‡ 2 เจ—เฉเจฃ เจนเจจ, เจคเจพเจ‚ 4 เจœเฉ‹เฉœเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ! เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจคเจฐ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจจเจคเฉ€เจœเจพ เจ…เจคเฉ‡ WHERE เจงเจพเจฐเจพ เจฆเฉ‹เจตเจพเจ‚ เจฒเจˆ เจ•เจฟเจธเจฎ เจ•เจพเจธเจŸเจฟเฉฐเจ— เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจธเจตเจพเจฒ เจฒเจฟเจ–เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ‡เจน เจธเจฐเฉ‹เจค เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจซเจพเจฒเจคเฉ‚ เจนเฉˆเฅค

เจ‡เจนเจจเจพเจ‚ เจธเจชเฉฑเจธเจผเจŸ เจ•เจฎเฉ€เจ†เจ‚ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, EAV เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ‡เจธ เจ•เจฟเจธเจฎ เจฆเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค เจ‡เจน เจ…เจŸเฉฑเจฒ เจ•เจฎเฉ€เจ†เจ‚ เจธเจจ, เจ…เจคเฉ‡ เจ•เฉ‹เจˆ เจฌเจฟเจนเจคเจฐ เจตเจฟเจ•เจฒเจช เจจเจนเฉ€เจ‚ เจธเฉ€เฅค
เจชเจฐ เจซเจฟเจฐ PostgreSQL เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ "เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€" เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจˆ ...

PostgreSQL 9.4 เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, JSONB เจกเฉ‡เจŸเจพ เจ•เจฟเจธเจฎ เจจเฉ‚เฉฐ JSON เจฌเจพเจˆเจจเจฐเฉ€ เจกเฉ‡เจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฒเจˆ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹