PostgreSQL āĻ JSONB āĻāϰ āϏāĻžāĻĨ⧇ EAV āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

TL; DR: JSONB āϕ⧋āϝāĻŧ⧇āϰāĻŋ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏāϕ⧇ āĻ¤ā§āϝāĻžāĻ— āύāĻž āĻ•āϰ⧇āχ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŦāĻŋāĻ•āĻžāĻļāϕ⧇ āĻŦā§āϝāĻžāĻĒāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻšāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āφāϏ⧁āύ āĻāĻ•āϟāĻŋ āϰāĻŋāϞ⧇āĻļāύāĻžāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ (āĻĄāĻžāϟāĻžāĻŦ⧇āϏ) āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āĻĒā§āϰāĻžāĻšā§€āύāϤāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϏāĻŽā§āĻ­āĻŦāϤ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāϏāĻŋāĻ• āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝāĻžāĻ•: āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻ¤ā§āϤāĻž āφāϛ⧇ āĻāĻŦāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āĻāχ āϏāĻ¤ā§āϤāĻžāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ (āϗ⧁āĻŖāĻžāĻŦāϞ⧀) āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŦ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇ āĻāĻ•āχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ⧇āϰ āϏ⧇āϟ āύāĻžāĻ“ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āφāϰāĻ“ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻāχ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧ āĻšāϞ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻŽā§āĻĒāĻ¤ā§āϤāĻŋāϰ āĻŽāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻŸā§‡āĻŦāĻŋāϞ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻ¤ā§āϤāĻž āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϗ⧁āϞāĻŋ āĻĒā§‚āϰāĻŖ āĻ•āϰāĻžāĨ¤ āĻĻāĻžāϰ⧁āĻŖ! āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇... āϝāϤāĻ•ā§āώāĻŖ āύāĻž āφāĻĒāύāĻžāϰ āĻŸā§‡āĻŦāĻŋāϞ⧇ āϞāĻ•ā§āώ āϞāĻ•ā§āώ āϰ⧇āĻ•āĻ°ā§āĻĄ āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āϰ⧇āĻ•āĻ°ā§āĻĄ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

EAV āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ (āϏāĻ¤ā§āϤāĻž-āĻ…ā§āϝāĻžāĻŸā§āϰāĻŋāĻŦāĻŋāωāϟ-āĻŽāĻžāύ), āĻāϟāĻŋ āĻĒā§āϰāĻžāϝāĻŧāχ āϘāĻŸā§‡āĨ¤ āĻāĻ•āϟāĻŋ āĻŸā§‡āĻŦāĻŋāϞ⧇ āϏāĻ¤ā§āϤāĻž (āϰ⧇āĻ•āĻ°ā§āĻĄ) āϰāϝāĻŧ⧇āϛ⧇, āĻ…āĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŸā§‡āĻŦāĻŋāϞ⧇ āϏāĻŽā§āĻĒāĻ¤ā§āϤāĻŋāϰ āύāĻžāĻŽ (āϗ⧁āĻŖāĻžāĻŦāϞ⧀) āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āϤ⧃āϤ⧀āϝāĻŧ āĻŸā§‡āĻŦāĻŋāϞāϟāĻŋ āϏāĻ¤ā§āϤāĻžāϕ⧇ āϤāĻžāĻĻ⧇āϰ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻ¤ā§āϤāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϗ⧁āϞāĻŋāϰ āĻŽāĻžāύ āϰāϝāĻŧ⧇āϛ⧇⧎ āĻāϟāĻŋ āφāĻĒāύāĻžāϕ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ⧇āϰ āϏ⧇āϟ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ—āĻ āύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āύāĻž āĻ•āϰ⧇āχ āĻĢā§āϞāĻžāχāϤ⧇ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϝ⧋āĻ— āĻ•āϰ⧇āĨ¤

āϝāĻžāχāĻšā§‹āĻ•, āϝāĻĻāĻŋ āχāĻ­āĻž āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻ•āĻŋāϛ⧁ āĻ–āĻžāϰāĻžāĻĒ āĻĻāĻŋāĻ• āύāĻž āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āφāĻŽāĻŋ āĻāχ āĻĒā§‹āĻ¸ā§āϟāϟāĻŋ āϞāĻŋāĻ–āĻŦ āύāĻžāĨ¤ āϏ⧁āϤāϰāĻžāĻ‚, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĒā§āϰāϤāĻŋāϟāĻŋ 1āϟāĻŋ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϝ⧁āĻ•ā§āϤ āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻ¤ā§āϤāĻž āĻĒ⧇āϤ⧇, āĻ•ā§āϝ⧋āϝāĻŧāĻžāϰ⧀āϤ⧇ 2āϟāĻŋ āϝ⧋āĻ—āĻĻāĻžāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ: āĻĒā§āϰāĻĨāĻŽāϟāĻŋ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āϝ⧋āĻ—āĻĻāĻžāύ, āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϟāĻŋ āĻŽāĻžāύ āĻŸā§‡āĻŦāĻŋāϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āϝ⧋āĻ—āĻĻāĻžāύāĨ¤ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āϏāĻ¤ā§āϤāĻžāϰ 2āϟāĻŋ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ 4āϟāĻŋ āϝ⧋āĻ—āĻĻāĻžāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ! āωāĻĒāϰāĻ¨ā§āϤ⧁, āϏāĻŽāĻ¸ā§āϤ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ, āϝāĻžāϰ āĻĢāϞ⧇ āĻĢāϞāĻžāĻĢāϞ āĻāĻŦāĻ‚ WHERE āĻ•ā§āϞāϜ āωāĻ­āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϟāĻžāχāĻĒ āĻ•āĻžāĻ¸ā§āϟāĻŋāĻ‚ āĻšāϝāĻŧāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻ…āύ⧇āĻ• āĻĒā§āϰāĻļā§āύ āϞ⧇āϖ⧇āύ, āϤāĻžāĻšāϞ⧇ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāϟāĻŋ āĻŦ⧇āĻļ āĻ…āĻĒāϚāϝāĻŧāĨ¤

āĻāχ āϏ⧁āĻ¸ā§āĻĒāĻˇā§āϟ āĻ¤ā§āϰ⧁āϟāĻŋāϗ⧁āϞāĻŋ āϏāĻ¤ā§āĻ¤ā§āĻŦ⧇āĻ“, āĻāχ āϧāϰāύ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ EAV āĻĻā§€āĻ°ā§āϘāĻ•āĻžāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϗ⧁āϞāĻŋ āĻ…āύāĻŋāĻŦāĻžāĻ°ā§āϝ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻāϰ āĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āφāϰ āĻ›āĻŋāϞ āύāĻžāĨ¤
āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻĒāϰ āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āĻāϏāĻ•āĻŋāωāĻāϞ-āĻ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ "āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ" āωāĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ...

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
);

āĻĻ⧇āĻ–āϤ⧇ āĻ…āύ⧇āĻ• āϏāĻšāϜ, āϤāĻžāχ āύāĻž? āϤāĻžāϰāĻĒāϰ⧇ āĻāϟāĻŋ āϏāĻ¤ā§āϤāĻž āĻŸā§‡āĻŦāĻŋāϞ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ (āϏāĻ¤ā§āϤāĻž & 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 āĻāĻ–āĻžāύ⧇ āϜāĻŋāϤ⧇āϛ⧇! āφāĻŽāϰāĻž 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 āĻ•āϞāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝāĨ¤

āĻĄā§‡āϟāĻž āφāĻĒāĻĄā§‡āϟāϟāĻŋ āϏāĻŽāϝāĻŧ⧇āϰ āĻĒāϰāĻŋāĻĒā§āϰ⧇āĻ•ā§āώāĻŋāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĢāϞāĻžāĻĢāϞāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻŋāϝāĻŧ⧇āϛ⧇ (āĻāĻŽāĻāϏ⧇)āĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻ¸ā§āϕ⧇āϞāϟāĻŋ āϞāĻ—āĻžāϰāĻŋāĻĻāĻŽāĻŋāĻ•:

PostgreSQL āĻ JSONB āĻāϰ āϏāĻžāĻĨ⧇ EAV āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āφāĻŽāϰāĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āĻ›āĻŋ āϝ⧇ JSONB EAV āĻāϰ āĻšā§‡āϝāĻŧ⧇ āĻ…āύ⧇āĻ• āĻĻā§āϰ⧁āϤ (> 50000-x) āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϏ⧂āĻšā§€ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰ⧇āύ, āωāĻĒāϰ⧇ āωāĻ˛ā§āϞāĻŋāĻ–āĻŋāϤ āĻ•āĻžāϰāϪ⧇āĨ¤ āϝāĻ–āύ āφāĻŽāϰāĻž āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϕ⧀āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āϞāĻžāĻŽāϗ⧁āϞāĻŋāϕ⧇ āϏ⧂āĻšā§€ āĻ•āϰāĻŋ, āϤāĻ–āύ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āĻĒā§āϰāĻžāϝāĻŧ āĻ…āĻĻ⧃āĻļā§āϝ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āϤāĻŦ⧇ JSONB āĻāĻ–āύāĻ“ EAV āĻĨ⧇āϕ⧇ 1,3 āϗ⧁āĻŖ āĻĻā§āϰ⧁āϤāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ JSONB āĻ•āϞāĻžāĻŽā§‡āϰ āϏ⧂āĻšā§€ āĻāĻ–āĻžāύ⧇ āϕ⧋āύ āĻĒā§āϰāĻ­āĻžāĻŦ āύ⧇āχ āĻ•āĻžāϰāĻŖ āφāĻŽāϰāĻž āĻŽā§‚āĻ˛ā§āϝāĻžāϝāĻŧāύ⧇āϰ āĻŽāĻžāύāĻĻāĻŖā§āĻĄā§‡ āϏāĻŽā§āĻĒāĻ¤ā§āϤāĻŋ āĻ•āϞāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻ›āĻŋ āύāĻžāĨ¤

āϏāĻŽā§āĻĒāĻ¤ā§āϤāĻŋ āĻŽāĻžāύ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻĄā§‡āϟāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĢāϞāĻžāĻĢāϞ (āϏāĻžāϧāĻžāϰāĻŖ āĻ¸ā§āϕ⧇āϞ) āĻĒāĻžāχ:

PostgreSQL āĻ JSONB āĻāϰ āϏāĻžāĻĨ⧇ EAV āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āφāĻĒāύāĻŋ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝ⧇ JSONB āφāĻŦāĻžāϰ āϏ⧂āĻšā§€ āĻ›āĻžāĻĄāĻŧāĻžāχ EAV āĻāϰ āĻšā§‡āϝāĻŧ⧇ āĻĻā§āϰ⧁āϤ āĻ•āĻžāϜ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻ–āύ EAV āϏ⧂āĻšā§€ āϏāĻš, āĻāϟāĻŋ āĻāĻ–āύāĻ“ JSONB āĻāϰ āĻšā§‡āϝāĻŧ⧇ āĻĻā§āϰ⧁āϤ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻĒāϰ āφāĻŽāĻŋ āĻĻ⧇āϖ⧇āĻ›āĻŋ āϝ⧇ JSONB āĻĒā§āϰāĻļā§āύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŽāϝāĻŧ āĻāĻ•āχ āĻ›āĻŋāϞ, āĻāϟāĻŋ āφāĻŽāĻžāϕ⧇ āϜāĻŋāφāχāĻāύ āϏ⧂āϚāĻ•āϗ⧁āϞāĻŋ āĻ•āĻžāϜ āĻ•āϰ⧇ āύāĻž āĻāχ āĻŦāĻŋāώāϝāĻŧāϟāĻŋāϤ⧇ āĻĒā§āϰāϰ⧋āϚāĻŋāϤ āĻ•āϰ⧇āĻ›āĻŋāϞāĨ¤ āĻĻ⧃āĻļā§āϝāϤ āφāĻĒāύāĻŋ āϝāĻ–āύ āϜāύāĻŦāĻšā§āϞ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϏāĻš āĻāĻ•āϟāĻŋ āĻ•āϞāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ āϜāĻŋāφāχāĻāύ āϏ⧂āϚāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ…āĻĒāĻžāϰ⧇āϟāϰ @> āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻšāϝāĻŧāĨ¤ āφāĻŽāĻŋ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĒāϰ⧀āĻ•ā§āώāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋ āϏāĻŽāϝāĻŧ⧇āϰ āωāĻĒāϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļāĻžāϞ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĢ⧇āϞ⧇āϛ⧇: āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ 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

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster