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 āĻ‰āĻŦā§āĻ¨ā§āĻŸā§ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨