TL; DR: JSONB-แก แจแแฃแซแแแ แแแแจแแแแแแแแแ แแแแแแ แขแแแแก แแแแแชแแแแ แแแแแก แกแฅแแแแก แจแแแฃแจแแแแแ แจแแแแแฎแแแก แจแแกแ แฃแแแแแก แจแแฌแแ แแแก แแแ แแจแ.
แจแแกแแแแแ
แแแแแ แแแแแงแแแแแ แ แแแแชแแฃแ แ แแแแแชแแแแ แแแแแก (แแแแแชแแแแ แแแแแก) แแกแแคแแแแจแ แแแแแ แแ แ-แแ แแ แฃแซแแแแแกแ แแแแแงแแแแแแก แจแแแแฎแแแแแก แแแแกแแแฃแ แ แแแแแแแแ: แฉแแแ แแแแฅแแก แแ แแแฃแแ แแ แฃแแแ แจแแแแแแฎแแ แแ แแ แแแฃแแแก แแแ แแแแฃแแ แแแแกแแแแแ (แแขแ แแแฃแขแแแ). แแแแ แแ แงแแแแ แแแกแขแแแชแแแก แแ แจแแแซแแแแ แฐแฅแแแแแก แแแแกแแแแแแก แแ แแแแแ แ แแแแ แแแ แแ แแแแแแแแจแ แจแแแซแแแแ แแแแแแขแแก แแแขแ แแแแกแแแ.
แแ แแ แแแแแแแก แแแแแกแแญแ แแแแ แฃแแแ แขแแแแกแ แแแแ แแแแแชแแแแ แแแแแก แชแฎแ แแแจแ แกแแแขแแก แจแแฅแแแ แแแแแแฃแแ แฅแแแแแแก แแแแจแแแแแแแแกแแแแก แแ แฃแแ แแแแ แจแแแแกแแ แแก, แ แแช แกแแญแแ แแ แแแแแ แแขแฃแแ แแ แแแฃแแแก แแแแแแแแแกแแแแก. แแแแ! แแ แแแแแแ แแแแแแ แแแฃแแแ... แกแแแแ แแฅแแแแ แชแฎแ แแแ แแ แจแแแชแแแก แแแแแแแแแแ แฉแแแแฌแแ แก แแ แแฅแแแ แฃแแแ แแแแแแขแแ แแฎแแแ แฉแแแแฌแแ แ.
แแแแแแฎแแแแ EAV แแแแฃแจแ (
แแฃแแชแ, แแ แแ แแแแฌแแ แแ แแ แแแกแขแก, แ แแ แแ แงแแคแแแแงแ EVA แแแแแแแแก แฃแแ แงแแคแแแ แแฎแแ แแแแ. แแกแ แ แแ, แแแแแแแแแ, แแ แแ แแ แแแขแ แแ แแแฃแแแก แแแกแแฆแแแแ, แ แแแแแแกแแช แแฅแแ 1 แแขแ แแแฃแขแ, แแแแฎแแแแแจแ แกแแญแแ แแ 2 แจแแแ แแแแ: แแแ แแแแ แแ แแก แจแแแ แแแแ แแขแ แแแฃแขแแแแก แชแฎแ แแแแแ, แแแแ แ แแ แแก แจแแแ แแแแ แแแแจแแแแแแแแแแก แชแฎแ แแแแแ. แแฃ แแ แแแฃแแก แแฅแแก 2 แแขแ แแแฃแขแ, แแแจแแ แกแแญแแ แแ 4 แจแแแ แแแแ! แแแ แแ แแแแกแ, แงแแแแ แแขแ แแแฃแขแ, แ แแแแ แช แฌแแกแ, แแแแฎแแแ แกแขแ แแฅแแแแแแก แกแแฎแแ, แ แแช แแฌแแแแก แ แแแแ แช แจแแแแแแก, แแกแแแ WHERE แแฃแแฅแขแแก แขแแแแแแก แฉแแแแงแแแแแแแแก. แแฃ แแฅแแแ แฌแแ แ แฃแแแ แแ แจแแแแแฎแแแก, แแแจแแ แแก แกแแแแแแ แคแฃแญแแ แ แแกแฃแ แกแแแแก แแแแแงแแแแแแก แแแแแกแแแ แแกแแ.
แแ แแจแแแ แ แแแแแแแแแแแแแแก แแแฃแฎแแแแแแ, EAV แแแแ แฎแแแแ แแแแแแงแแแแแ แแ แขแแแแก แแ แแแแแแแแแก แแแแแกแแญแ แแแแ. แแก แแงแ แแแ แแแฃแแแแ แแแแแแแแแแแแแ แแ แฃแแแแแกแ แแแขแแ แแแขแแแ แฃแแ แแแแ แแ แแ แกแแแแแแ.
แแแแ แแ แจแแแแแ แแฎแแแ "แขแแฅแแแแแแแ" แแแแแฉแแแ PostgreSQL-แจแ...
PostgreSQL 9.4-แแแ แแแฌแงแแแฃแแ, JSONB แแแแแชแแแแ แขแแแ แแแแแแขแ JSON แแ แแแแแ แแแแแชแแแแแแก แจแแกแแแแฎแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแ แคแแ แแแขแจแ JSON-แแก แจแแแแฎแแแก, แฉแแแฃแแแแ แแ, แชแแขแ แแแขแ แกแแแ แชแ แแ แแ แ แกแญแแ แแแแ, แแแแ แ แฉแแแฃแแแแ แแแ แขแแฅแกแขแฃแ แ JSON, แแแกแแ แแแแ แแชแแแแแก แจแแกแ แฃแแแแ แแแแ แแ แฃแคแ แ แกแฌแ แแคแแ. JSONB แแกแแแ แแฎแแ แก แฃแญแแ แก แแแแแฅแกแแ แแแแก, แ แแช แแแแฎแแแแก แแแแแ แฃแคแ แ แแฉแฅแแ แแแก.
JSONB แแแแแชแแแแ แขแแแ แกแแจแฃแแแแแแก แแแแซแแแแก แจแแแชแแแแแ แฃแฎแแ แฎแฃแแ EAV แแแแฃแจแ แฉแแแแก แแ แแแฃแแแ แชแฎแ แแแจแ แแฎแแแแ แแ แแ JSONB แกแแแขแแก แแแแแขแแแแ, แ แแช แแแแจแแแแแแแแแ แแแแ แขแแแแแก แแแแแชแแแแ แแแแแก แแแแแแแก. แแแแ แแ แแแแ แ แแแขแแแชแแแก, แ แแ แแแแก แฃแแแ แแฎแแแแก แแ แแแฃแฅแขแแฃแแแแแก แจแแแชแแ แแแ... แแแแขแแ แแแแฌแแ แ แแก แกแขแแขแแ.
แกแแขแแกแขแ แแแแแชแแแแ แแแแแก แแแงแแแแแ
แแ แจแแแแ แแแแกแแแแก, แแ แจแแแฅแแแแ แแแแแชแแแแ แแแแ PostgreSQL 9.5-แแก แแฎแแแ แแแกแขแแแแชแแแก แจแแกแแฎแแ 80$-แแแแ แแแแกแขแ แฃแฅแชแแแ.
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.แแแแกแแแแแ. แแแ แแแแ, แฉแแแ แแแแแฆแแ แ แแแแแแแแ แแแแกแฎแแแแแแฃแแ แขแแแแก แแแแแชแแแแ แขแแแ แแแแกแแแแแแก แแแแ แแแแแแแฅแขแก แจแแ แแก. แแแแแแแแ แแแแแชแแแแแ:
{
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 แแแแแฅแขแจแ แฅแแแแแแก แแแแจแแแแแแแแก แแแกแแแฎแแแแแแ, แฉแแแ แฃแแแ แแแแแแแงแแแแ แคแฃแแฅแชแแ
แแฎแแ แแแแแ แแแแ แฉแแแ แแ แแแฃแแ, แ แแแแแแช แแฎแแแฎแแ แแแแแแแฎแแแ แแแกแ แแฎแแแ แคแแ แแก แแแฎแแแแแ:
-- 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 แแแแฎแแแแแแ, แแกแแแ แแฅ
แแฎแแ แแ แแ แแแกแแฃแแ แแ แจแแกแ แฃแแแแแแ.
แแแฅแแแแแแ
แจแแกแ แฃแแแแแก แจแแกแแแแ แแแแแ แแแแแแแงแแแ
แแแแแชแแแแ แแแแแฎแแแแแ แแฉแแแแ แจแแแแแแ แจแแแแแแแ แแ แแแก แแแฎแแแแแ (ms). แแแแแแแแแกแฌแแแแ, แ แแ แแแกแจแขแแแ แแแแแ แแแแฃแแแ:
แฉแแแ แแฎแแแแแ, แ แแ JSONB แแแแ แแ (> 50000-x) แฃแคแ แ แกแฌแ แแคแแ แแแแ แ EAV, แแฃ แแ แแงแแแแแ แแแแแฅแกแแแก, แแแแแ แแฆแแแจแแฃแแ แแแแแแแก แแแแ. แ แแแแกแแช แฉแแแ แแแแแ แกแแแขแแแก แแแ แแแแแแ แแแแแแจแแแแ, แแแแกแฎแแแแแแ แแแแฅแแแก แฅแ แแแ, แแแแ แแ JSONB แแแแแช 1,3-แฏแแ แฃแคแ แ แกแฌแ แแคแแ แแแแ แ EAV. แแแแแแแแแกแฌแแแแ, แ แแ JSONB แกแแแขแแก แแแแแฅแกแก แแฅ แแ แแแแแ แ แแคแแฅแขแ แแ แแฅแแก, แ แแแแแ แฉแแแ แแ แแแงแแแแแ แฅแแแแแแก แกแแแขแก แจแแคแแกแแแแก แแ แแขแแ แแฃแแแแจแ.
แฅแแแแแแก แฆแแ แแแฃแแแแแก แกแแคแฃแซแแแแแ แแแแแชแแแแแแก แแ แฉแแแแกแแแแก, แฉแแแ แแแฆแแแ แจแแแแแ แจแแแแแแแก (แแแ แแแแฃแ แ แแแกแจแขแแแ):
แจแแแแซแแแแ แจแแแแฉแแแแ, แ แแ JSONB แแกแแ แฃแคแ แ แกแฌแ แแคแแ แแฃแจแแแแก แแแแ แ EAV แแแแแฅแกแแแแก แแแ แแจแ, แแแแ แแ แ แแแแกแแช EAV แแแแแฅแกแแแแ, แแก แแแแแช แฃแคแ แ แกแฌแ แแคแแ แแฃแจแแแแก แแแแ แ JSONB. แแแแ แแ แจแแแแแ แแแแแแแฎแ, แ แแ JSONB แแแแฎแแแแแแแก แแ แ แแแแแ แแงแ, แแแแ แแแแแซแแ แแแแแ, แ แแ GIN แแแแแฅแกแแแ แแ แแฃแจแแแแก. แ แแแแ แช แฉแแแก, แ แแแแกแแช แแงแแแแแ GIN แแแแแฅแกแก แแแกแแฎแแแแฃแแ แแแแกแแแแแแก แแฅแแแ แกแแแขแแ, แแก แซแแแแจแ แจแแแแก แแฎแแแแ แแแแ แแขแแ แแก @> แแแแแงแแแแแแกแแก. แแ แแก แแแแแแแงแแแ แแฎแแ แขแแกแขแจแ แแ แแแ แแแแ แแแแแแแ แแแแฎแแแแ แแ แแแ: แแฎแแแแ 0,153 ms! แแก แแ แแก 15000-แฏแแ แฃแคแ แ แกแฌแ แแคแ แแแแ แ EAV แแ 25000-แฏแแ แฃแคแ แ แกแฌแ แแคแ แแแแ แ ->> แแแแ แแขแแ แ.
แแแแแ แกแแแแแ แแกแแ แกแฌแ แแคแ แแงแ!
แแแแแชแแแแ แแแแแก แชแฎแ แแแแก แแแแ
แแแแแ แจแแแแแแ แแ แชแฎแ แแแแก แแแแแแ แแ แแแ แแแแแแแแกแแแแก. psql-แจแ แฉแแแ แจแแแแแซแแแ แแแฉแแแแแ แงแแแแ แชแฎแ แแแแกแ แแ แแแแแฅแกแแก แแแแ แแ แซแแแแแแก แแแแแงแแแแแแ dti+
EAV แแแแแแแแกแแแแก, แชแฎแ แแแแก แแแแแแแ แแแแฎแแแแแแ 3068 MB แแ แแแแแฅแกแแแ 3427 MB-แแแ, แกแแแ แแ แฏแแแจแ 6,43 GB. JSONB แแแแแแแ แแงแแแแแก 1817 MB แชแฎแ แแแแกแแแแก แแ 318 MB แแแแแฅแกแแแแกแแแแก, แ แแช แแ แแก 2,08 GB. แแแแแแแก 3-แฏแแ แแแแแแแ! แแ แคแแฅแขแแ แแแแแ แแแแแแแแ แแ, แ แแแแแ แฉแแแ แแแแแฎแแแ แฅแแแแแแก แกแแฎแแแแแก แงแแแแ JSONB แแแแแฅแขแจแ.
แแแแ แแ แแแแแช, แ แแชแฎแแแแ แแแแแกแแแแแ แกแแฃแแ แแแแ: EAV-แจแ แฉแแแ แแแแแฎแแแ 2 แแแแ แฃแชแฎแแฃแ แแแกแแฆแแแก แแขแ แแแฃแขแแก แแแแจแแแแแแแแกแแแแก, แ แแช แแฌแแแแก 8 แแแแขแก แแแแแขแแแแ แแแแแชแแแก. แแแ แแ แแแแกแ, EAV แแแแฎแแแก แฅแแแแแแก แงแแแแ แแแแจแแแแแแแแก แขแแฅแกแขแแก แกแแฎแแ, แฎแแแ JSONB แแแแแแงแแแแแก แชแแคแ แฃแ แแ แแแแแแฃแ แแแแจแแแแแแแแแก แจแแแแแ, แกแแแแช แแก แจแแกแแซแแแแแแแ, แ แแช แแแแแแฌแแแแก แฃแคแ แ แแชแแ แ แแแแแแญแแก.
แจแแแแแแแ
แแแแแแแแแแจแ, แแคแแฅแ แแ, แแ แแแฃแแแก แแแแกแแแแแแก JSONB แคแแ แแแขแจแ แจแแแแฎแแแ แจแแแซแแแแ แแแแแแแแแแก แแฅแแแแ แแแแแชแแแแ แแแแแก แแแแแแแ แแ แจแแแแ แฉแฃแแแแ. แแฃ แแฅแแแ แแฌแแ แแแแแ แฃแแแ แแ แแแแฎแแแแแก, แแแจแแ แงแแแแแคแ แแก แจแแแแฎแแ แแแแแ แชแฎแ แแแจแ, แ แแแแ แช แแ แแแฃแแ, แ แแแแฃแ แแ แฃแคแ แ แแคแแฅแขแฃแ แแ แแแฃแจแแแแแก. แแ แแก แคแแฅแขแ, แ แแ แแก แแแแ แขแแแแแก แแแแแชแแแแแก แจแแ แแก แฃแ แแแแ แแฅแแแแแแแก, แฃแแแ แแแฃแกแแ, แแแแ แแ แจแแแแแแ แแแฆแแแฃแแ แแแแแชแแแแ แแแแ 3-แฏแแ แฃแคแ แ แแชแแ แแ แแแชแฃแแแแแ.
แแกแแแ, แฉแแขแแ แแแฃแแ แขแแกแขแแแแแแ แแแแแแแแแแ แ, แจแแแแแซแแแ แแแแแกแแแแแ, แ แแ แจแแกแ แฃแแแแแก แแแแแแแ แแ แซแแแแแ แฃแแแแจแแแแแแ. แแแแแแ แ แจแแแแฎแแแแแจแ, JSONB แฃแคแ แ แกแฌแ แแคแแ แแแแ แ EAV, แ แแช แแแก แแแแแ แฃแคแ แ แฃแแแแแกแก แฎแแแก. แแฃแแชแ, แแก แแแฉแแแแแแแแ, แ แ แแฅแแ แฃแแแ, แแ แแแแชแแแก แงแแแแ แแกแแแฅแขแก (แแแ. แแแแกแแแแแแก แซแแแแแ แแแแ แ แแแแแแแแแก แแฅแแแ แแแ แแแ, แแ แกแแแฃแแ แแแแแชแแแแแแก แแแแกแแแแแแก แ แแแแแแแแแก แแแแจแแแแแแแแแ แแ แแ,...), แแกแ แ แแ, แแฃ แแแฅแแ แ แแแแ แจแแแแแแแแแแแ แแแแ แแแฃแแฏแแแแกแแแแก แจแแกแแฎแแ. , แแแฎแแแ แแแขแแแแ แแแแแแขแแ แแแจแ!
แฌแงแแ แ: www.habr.com