เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ EAV เบเบฑเบš JSONB เปƒเบ™ PostgreSQL

TL; DR: JSONB เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ schema เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบชเบเบชเบฐเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก.

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ„เบฅเบฒเบชเบชเบดเบเบ‚เบญเบ‡เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเปเบฅเบฐเบ™เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเป€เบเบปเปˆเบฒเปเบเปˆเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เป‚เบฅเบเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ (เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™): เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบซเบ™เปˆเบงเบเบ‡เบฒเบ™, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฐเบซเบเบฑเบ”เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” (เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ) เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ™เบตเป‰. เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบฒเบ”เบˆเบฐเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ”เบฝเบงเบเบฑเบ™, เปเบฅเบฐเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบญเบฒเบ”เบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฅเปเบฒเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบŠเบฑเบšเบชเบดเบ™, เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบชเบฐเป€เบžเบฒเบฐ. เบเบดเปˆเบ‡เปƒเบซเบเปˆ! เบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚ ... เบˆเบปเบ™เบเปˆเบงเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบกเบตเบšเบฑเบ™เบ—เบถเบเบซเบผเบฒเบเบฅเป‰เบฒเบ™เปเบฅเบฐเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบšเบฑเบ™เบ—เบถเบเปƒเบซเบกเปˆ.

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฎเบนเบšเปเบšเบš EAV (Entity-Attribute-Value), เบกเบฑเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เบถเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบซเบ™เปˆเบงเบเบ‡เบฒเบ™ (เบšเบฑเบ™เบ—เบถเบ), เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบญเบทเปˆเบ™เบกเบตเบŠเบทเปˆเบŠเบฑเบšเบชเบดเบ™ (เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ), เปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเบชเบฒเบก entities เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบฅเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™. เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบˆเบฐเบกเบตเบŠเบธเบ”เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเบเบฑเบ‡เป€เบžเบตเปˆเบกเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™เบเบฒเบ™เบšเบดเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเป„เบ”เป‰เบ‚เบฝเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ™เบตเป‰เบ–เป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ EVA. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบซเบ™เบถเปˆเบ‡เบซเบผเบทเบซเบผเบฒเบเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบต 1 attribute เปเบ•เปˆเบฅเบฐเบ„เบปเบ™, 2 Joins เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก: เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ, เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ„เปˆเบฒ. เบ–เป‰เบฒเบ™เบดเบ•เบดเบšเบธเบเบ„เบปเบ™เบกเบต 2 เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ, เบ•เป‰เบญเบ‡เบเบฒเบ™ 4 เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก! เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบฑเบ‡เปเบปเบ”เปเบกเปˆเบ™เบ–เบทเบเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเป€เบ›เบฑเบ™เบชเบฐเบ•เบฃเบดเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบ›เบฐเป€เบžเบ”เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš เปเบฅเบฐเบ›เบฐเป‚เบซเบเบ WHERE. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ‚เบฝเบ™เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบซเบผเบฒเบ, เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบชเบเป€เบ‡เบดเบ™เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™.

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, EAV เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบกเบฒเบ”เบปเบ™เบ™เบฒเบ™เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ›เบฐเป€เบžเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ—เบตเปˆเบซเบผเบตเบเบฅเปˆเบฝเบ‡เบšเปเปˆเป„เบ”เป‰, เปเบฅเบฐเบšเปเปˆเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ.
เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ "เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบต" เปƒเบซเบกเปˆเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™ PostgreSQL ...

เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ PostgreSQL 9.4, เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™ JSONB เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ„เบนเปˆ JSON. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ JSON เปƒเบ™เบฎเบนเบšเปเบšเบšเบ™เบตเป‰เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบˆเบฐเปƒเบŠเป‰เบžเบทเป‰เบ™เบ—เบตเปˆเปเบฅเบฐเป€เบงเบฅเบฒเบซเบผเบฒเบเบเปˆเบงเบฒ JSON เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เปเบฒเบกเบฐเบ”เบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบกเบฑเบ™เปเบกเปˆเบ™เป„เบงเบเบงเปˆเบฒเบซเบผเบฒเบ. JSONB เบเบฑเบ‡เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบต, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป„เบงเบ‚เบถเป‰เบ™.

เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™ JSONB เบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบฎเบนเบšเปเบšเบš EAV เบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบ–เบฑเบ™ JSONB เบžเบฝเบ‡เบญเบฑเบ™เบ”เบฝเบงเปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบปเบงเปœเปˆเบงเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบญเบญเบเปเบšเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบ. เปเบ•เปˆเบซเบผเบฒเบเบ„เบปเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบงเปˆเบฒเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบกเบฒเบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เบ‚เบญเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ” ... เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบซเบกเปˆเบ‚เบญเบ‡ PostgreSQL 9.5 เปƒเบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ $80. เบกเบฐเบซเบฒเบชเบฐเบธเบ”เบ”เบดเบˆเบดเบ•เบญเบฅ Ubuntu 14.04 เบซเบผเบฑเบ‡เบˆเบฒเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™ postgresql.conf เบ‚เป‰เบญเบเป„เบ”เป‰เปเบฅเปˆเบ™ เบ™เบตเป‰ script เป‚เบ”เบเปƒเบŠเป‰ 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 (เบ™เบดเบ•เบดเบšเบธเบเบ„เบปเบ™ & 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_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 เบŠเบฐเบ™เบฐเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰! เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ JSON ->> เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบชเบตเป€เบ›เบฑเบ™เบ„เปˆเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเบงเบฑเบ”เบ–เบธ JSONB. เบเบฑเบ‡เบกเบตเบงเบดเบ—เบตเบ—เบตเบชเบญเบ‡เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ”เบฝเบงเบเบฑเบ™เปƒเบ™เบฎเบนเบšเปเบšเบš 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 เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ”เบฑเบ”เบชเบฐเบ™เบต (เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบ•เปˆเบฒเบ‡เบ›เบฐเป€เบ—เบ”เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ”เบฑเบ”เบชเบฐเบ™เบต). เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเปƒเบ™ 2 เบ„เปเบฅเปเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ•เปˆเบฒเบ‡เบ›เบฐเป€เบ—เบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบกเบนเบ™เบ„เปˆเบฒ EAV, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบต. GIN เบชเปเบฒเบฅเบฑเบšเบ–เบฑเบ™ JSONB.

เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เป€เบงเบฅเบฒ (เปƒเบ™ ms). เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ‚เบฐเบซเบ™เบฒเบ”เปเบกเปˆเบ™ logarithmic:

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ EAV เบเบฑเบš JSONB เปƒเบ™ PostgreSQL

เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบงเปˆเบฒ JSONB เบซเบผเบฒเบ (> 50000-x) เป„เบงเบเบงเปˆเบฒ EAV เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเปƒเบŠเป‰เบ”เบฑเบ”เบชเบฐเบ™เบต, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเป„เบงเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบ–เบฑเบ™เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ, เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เป€เบเบทเบญเบšเบˆเบฐเบซเบฒเบเป„เบ›, เปเบ•เปˆ JSONB เบเบฑเบ‡เป„เบงเบเบงเปˆเบฒ EAV 1,3 เป€เบ—เบปเปˆเบฒ. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ”เบฑเบ”เบŠเบฐเบ™เบตเปƒเบ™เบ–เบฑเบ™ JSONB เบšเปเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ—เบตเปˆเบ™เบตเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบ„เปเบฅเปเบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เบœเบปเบ™.

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบทเบญเบเบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบกเบนเบ™เบ„เปˆเบฒเบŠเบฑเบšเบชเบดเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰ (เบ‚เบฐเบซเบ™เบฒเบ”เบ›เบปเบเบเบฐเบ•เบด):

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ EAV เบเบฑเบš JSONB เปƒเบ™ PostgreSQL

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒ JSONB เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเป„เบงเบเบงเปˆเบฒ EAV เป‚เบ”เบเบšเปเปˆเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบต, เปเบ•เปˆเป€เบกเบทเปˆเบญ EAV เบเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบต, เบกเบฑเบ™เบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเป„เบงเบเบงเปˆเบฒ JSONB. เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบงเปˆเบฒเป€เบงเบฅเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก JSONB เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™, เบ™เบตเป‰เป„เบ”เป‰เบเบฐเบ•เบธเป‰เบ™เปƒเบซเป‰เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒเบ”เบฑเบ”เบŠเบฐเบ™เบต GIN เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เปƒเบŠเป‰เบ”เบฑเบ”เบŠเบฐเบ™เบต GIN เบขเบนเปˆเปƒเบ™เบ–เบฑเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเบŠเบฒเบเบญเบ™, เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบกเบตเบœเบปเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฐเบเบญเบšเบกเบต @>. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบ™เบตเป‰เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบซเบกเปˆเปเบฅเบฐเบกเบฑเบ™เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เปƒเบ™เป€เบงเบฅเบฒ: เบžเบฝเบ‡เปเบ•เปˆ 0,153ms! เบ™เบตเป‰เปเบกเปˆเบ™ 15000 เป€เบ—เบทเปˆเบญเป„เบงเบเบงเปˆเบฒ EAV เปเบฅเบฐ 25000 เป€เบ—เบทเปˆเบญเป„เบงเบเบงเปˆเบฒเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ ->>.

เบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เป„เบงเบžเป!

เบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เปƒเบซเป‰เบ›เบฝเบšเบ—เบฝเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™. เปƒเบ™ psql เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ dti+

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ EAV เบเบฑเบš JSONB เปƒเบ™ PostgreSQL

เบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ EAV, เบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 3068 MB เปเบฅเบฐเบ”เบฑเบ”เบชเบฐเบ™เบตเป€เบ–เบดเบ‡ 3427 MB เบชเปเบฒเบฅเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” 6,43 GB. เบงเบดเบ—เบตเบเบฒเบ™ JSONB เปƒเบŠเป‰ 1817 MB เบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐ 318 MB เบชเปเบฒเบฅเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบต, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™ 2,08 GB. เบกเบฑเบ™ turns เบญเบญเบ 3 เป€เบ—เบปเปˆเบฒ! เบ„เบงเบฒเบกเบˆเบดเบ‡เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเปเบ›เบเปƒเบˆเป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบŠเบทเปˆเบŠเบฑเบšเบชเบดเบ™เบขเบนเปˆเปƒเบ™เบ—เบธเบเป†เบงเบฑเบ”เบ–เบธ JSONB.

เปเบ•เปˆเบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ•เบปเบงเป€เบฅเบเป€เบงเบปเป‰เบฒเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบญเบ‡: เปƒเบ™ EAV เบžเบงเบเป€เบฎเบปเบฒเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบ•เปˆเบฒเบ‡เบ›เบฐเป€เบ—เบ” 2 เบ•เบปเบงเป€เบฅเบเบ•เปเปˆเบกเบนเบ™เบ„เปˆเบฒเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ, เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰ 8 bytes เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, EAV เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบกเบนเบ™เบ„เปˆเบฒเบŠเบฑเบšเบชเบดเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบก, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ JSONB เบˆเบฐเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบเปเบฅเบฐเบ„เปˆเบฒ boolean เบžเบฒเบเปƒเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบตเบฎเบญเบเบ•เบตเบ™เบ™เป‰เบญเบเบฅเบปเบ‡.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เป‚เบ”เบเบฅเบงเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เบŠเบฑเบšเบชเบดเบ™เปƒเบ™เบฎเบนเบšเปเบšเบš JSONB เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบญเบญเบเปเบšเบšเปเบฅเบฐเบเบฒเบ™เบฎเบฑเบเบชเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบซเบผเบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบฎเบฑเบเบชเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ•เบปเบงเบˆเบดเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบ. เปเบฅเบฐเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเปเบกเปˆเบ™เปเบฅเป‰เบงเบšเบงเบ, เปเบ•เปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™ 3 เป€เบ—เบปเปˆเบฒเปƒเบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฐเบซเบผเบธเบšเป„เบ”เป‰เบงเปˆเบฒเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบกเปˆเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบ. เปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบต, JSONB เปเบกเปˆเบ™เป„เบงเบเบงเปˆเบฒ EAV, เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ™เบตเป‰เปเบ™เปˆเบ™เบญเบ™เบšเปเปˆเป„เบ”เป‰เบเบงเบกเป€เบญเบปเบฒเบ—เบธเบเบ”เป‰เบฒเบ™ (เป€เบŠเบฑเปˆเบ™: เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบซเบผเบฒเบ, เบˆเปเบฒเบ™เบงเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆ, เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ, ...), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ”เป†เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบžเบงเบเบกเบฑเบ™. , เบเบฐเบฅเบธเบ™เบฒเบฎเบนเป‰เบชเบถเบเบงเปˆเบฒเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบญเบญเบเปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster