TL; DR: JSONB α’αΆα αα½αααααα½ααααααΆαα’αα·αααααααααααααΆαααααΌαααααΆααα·ααααααααΆααααΆαααΆααααα½αααααα·αα αΆαααΆα ααααααααΆαα’αα»αααααααα½αα
ααα ααααΈααααΆα
α αΌααααααα§ααΆα ααααα»ααΆαααααααΈααααΎααααΆααα αΆαααααα»ααα½ααα αααα»ααα·ααααααΌαααααΆααα·ααααααααααΆαααααα (ααΌαααααΆααα·αααααα): ααΎαααΆαα’αααααΆααα½α α αΎαααΎαααααΌααααααΆαα»ααααααααααααααα·ααΆααααΆαα (αα»ααααααα) ααα’αααααΆααααα ααα»αααααα·αααααααααααααΈααΆααα’ααα’αΆα ααΆααααα»ααααααααααααααα·ααΌα ααααΆααααα α αΎααααααααααααααα·ααΆα αααΎααααα’αΆα ααααΌαααΆαααααααααΆαααα’ααΆααα
αααααααΆαααΆααααα½ααααα»αααΎααααΈαααααααΆααααα αΆαααααΊααΎααααΈαααααΎααα½ααααααα»αααΆααΆαααΌαααααΆααα·αααααααααααΆααααααααααααααααααααα·ααΈαα½αα α αΎαααααΆαααααααααααΌαα’αααΈαααααααΌαααΆααααααΆααααααα»ααΆααααΆααααΆαα½αα α’ααα αΆααα! αααα αΆααααΌαααΆααααααααΆα... αα αΌααααααΆααΆαααααα’αααααΆααααααααααΆααΆααααΆα α αΎαα’αααααααΌααααααααααααααααΆααααΈα
αα·α
αΆαααΆααααΌ EAV () ααΆααΎαα‘αΎαααΆααΉαααΆααα ααΆααΆααα½αααΆαααΆαα» (αααααααααΆ) ααΆααΆααα½ααααααΆαααααααααααααααααααα· (αα»ααααααα) αα·αααΆααΆαααΈααΈααααΆααααΆαα»ααΆαα½ααα»ααααααααααααα½ααα αα·αααΆαααααααααα»αααααααααΆααααααααααΆααα’αααααΆααα
αα
α»ααααααα ααΆαααααα±ααα’αααααΌααααααααΆααααα»αααΆαααΆααααα»ααααααααααααααα·ααααααααααΆαααααΆααααααα»ααααααααααΆ α αΎααααααΆαααααααααααααααααααααα·ααααΆααααααα·αααααΆααααααΌααα
ααΆααααααααααΌαααααΆααα·ααααααα
αααααΆαααΆαααΆααααα αααα»αααΉααα·αααααααααααΆαααααα ααααα·αααΎαα·αααΆαααΆαα
α»αα’αααααα½αα
ααα½αα
αααααα·ααΈααΆααααα EVA α ααΌα
αααα ααΆα§ααΆα ααα ααΎααααΈααα½αααΆαααΆαα»αα½α α¬α
αααΎααααααΆα 1 attribute ααΈαα½αα 2 Joins ααααΌαααΆαααΆαααΆααα
αααα»ααααα½αα ααΈαα½αααΊ Join with the attribute table ααΈααΈαααΊ join with the values ββtableα ααααα·αααΎα’αααααΆααα½αααΆααα»ααααααα 2 ααα 4 Joins ααΊα
αΆαααΆα
α! ααΎαααΈααα αα»αααααααααΆααα’ααααΆααααααΆααααΌαααΆααααααΆαα»αααΆααααα’αααα αααααΆαα±ααααΆααααααΌααααααααααααΆαααααααα αα·αααααΆ WHERE α ααααα·αααΎα’αααααααααααα½αα
αααΎα αααααΆαα·αααΆααααααααΆαααΆαα ααΆααααααΉαααΆαααααΎααααΆααααααΆαα
αααααΈααΆααΆαααΆαααααααΆαααΆαααααααααΆαααααααααα EAV ααααΌαααΆαααααΎααααΆααααΆααΌαααα αΎαααΎααααΈαααααααΆααααα αΆααΆαααααα ααΆαααααααΊααΆα
ααα»α
ααααααΆααααααααα·ααα½α
α αΎααα·αααΆααααααΎααααααΎαααΆααααααα
ααα»αααααααααΆαααα "αα
αα
αααα·ααααΆ" ααααΈαα½αααΆααααα αΆααααα½ααα
αααα»α PostgreSQL ...
αααα αΆααααααΎαααΆαα½α PostgreSQL 9.4 αααααααα·αααααα JSONB ααααΌαααΆαααααααααΎααααΈαααααΆαα»ααα·αααααααααααΈα JSON α αααααΈααΆααΆααααααΆαα»α JSON αα αααα»ααααααααααααΆααααααΆααααΌαααΆαααα α αα·ααααααααΆα αααΎαααΆαααααα·α JSON α’αααααααααααΆααααα ααααα·ααααα·ααΆαααΎααΆααΊααΏαααΆαα JSONB ααααΆααααααΆααααααΎααα·αα·ααααααααα αααααααΎα±αααααα½αααΆααααααΏαα
αααααααα·αααααα JSONB α’αα»ααααΆαα±ααααΎααααα½αααααΌ EAV αααααα»αααααΆαααααααααααα½ααα JSONB αα½ααα αααα»αααΆααΆαα’αααααΆαααααααΎα αααααααΎα’ααααΆααα ααΆααΌαααααΆααα·ααααααααΆαααΆαααΆααααα ααα»ααααααα»αααααΆα αααΎαααΆαααααααααΆ ααααα½αααααααΌαααΆαα’ααααααΆαααα α»αααααα·αααΆα... αααα αΎαααΆααΌαα ααα»ααααααα»ααααααα’ααααααααα
ααΆαααα‘αΎαααΌαααααΆααα·ααααααααΆααααα
αααααΆααααΆαααααααααααα αααα»αααΆααααααΎαααΌαααααΆααα·αααααααα ααΎααΆαααα‘αΎαααααΈαα PostgreSQL 9.5 αα ααΎ $80 build 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 α ααααααΆαααΆααααα ααΎααα·αα αΆαααΆα αααααΆααα’ααααααααΆαααΆαα½αααΆαα»αααα αααα‘ααααΎαα§ααΆα ααα 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 αααααααΎ @> operatorα
-- 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 ααααβααΆααβααααααααα αααααΆαααα½ααα JSONB α
ααΆαααααΎαα αα α»ααααααααΆααα·ααααααααΆααααα αΆαααΈααααααααΌα ααΆαααααααααα»ααααααααααααααααααΆ (αα·αααΆ ms)α α αααΆαααΆααΆαααααααΆαααΊααααΆααΈαα

ααΎαααΎαααΆ JSONB ααΆαα
αααΎα (> 50000-x) ααΏαααΆα EAV ααααα·αααΎα’ααααα·αααααΎαα·αα·αααααααααΆααα ααα»αααααααΆααααααΆααααΆαααΎα αα
ααααααααΎαααααΎαα·αα·αααααα½αααααΆαα½αααα
αααα ααΆααα»αααααΆααααΎαααααΆαααα
α αΎα ααα»αααα JSONB αα
ααααΏαααΆα EAV 1,3 ααα α
αααΆαααΆαα·αα·αααααα
ααΎαα½ααα JSONB αα·αααΆαα₯αααα·αααα
ααΈααααα αααααΆαααΎααα·αααααΎαα½αααααααααααααααα·αααα»ααααααααα·αα·α
ααααααΆααααααα
αααααΆααααΆαααααΎαααΎααα·αααααααααααα’ααααΎαααααα’α αααααααα ααΎαααα½αααΆαααααααααΌα ααΆαααααα (ααααΆαααααααΆ)α

α’αααα’αΆα
αααααααΆααααΆ JSONB αααααααααααΎαααΆαααΏαααΆα EAV αααααααΆααα·αα·αααα ααα»αααααα
αααααα EAV ααΆαα½ααα·αα·αααα ααΆαα
ααααααΎαααΆαααΏαααΆα JSONB α ααα»αααααααααΆαααααααα»αααΆαααΎαααΆαααααααΆαααααΆαααααα½α JSONB ααΊααΌα
ααααΆ αααααΆααααα»αα±αααααα»αααΉαααΆααααααααα GIN αα·αααααΎαααΆαα ααΆααααααααα
ααααααα’αααααααΎααααααααα GIN αα
ααΎαα½ααααααααΆααααααααααααααα·αααααΆααααα
αΌα ααΆααΆαααααα·αααααΆααααα
αααααααΎαα½ααααα
αΌαααααα·ααααα·αα @> ααα»αααααα αααα»αααΆαααααΎααΆαα
αααα»αααΆαααααΎαααααααααΈα αΎαααΆααΆαα₯αααα·αααααΆαααααΆαααα
ααΎαααααααΆα ααααΉααα 0,153ms ααα»ααααα! αααααΊααΏαααΆα EAV 15000 αα αα·αααΏαααΆα 25000 ααααΆα ->> operatorα
αααα»ααα·αααΆααΆααΏααααα!
ααα αααΆααΆαααΌαααααΆααα·αααααα
α αΌαααΎαααααααααααα αααΆααΆααααααΆαααα·ααΈααΆαααααααΆααααΈαα αα αααα»α psql ααΎαα’αΆα αααα αΆαααα αααααΆααΆα αα·ααα·αα·ααααααΆααα’αααααααααΎααΆααααααααΆ dti+

αααααΆαααα·ααΈααΆααααα EAV ααα αααΆααΆαααΊαααα αα 3068 MB αα·ααα·αα·αααααα αΌαααα 3427 MB αααααΆααααα αααα»α 6,43 GBα αα·ααΈααΆααααα JSONB ααααΎ 1817 MB αααααΆααααΆααΆα αα·α 318 MB αααααΆαααα·αα·αααα αααααΆαααα α 2,08 GBα ααΆααααααΆαα·α
ααΆα 3 αα! ααΆααα·ααααααΆαααααΎα±αααααα»αααααΆααααα’αΎαααααα·α
αααααααΎααααααΆαα»ααααααα’α
αααααααααα
αααα»ααααααααααα» JSONB α
ααα»αααααα ααααααα·ααΆααααααΆαααααα½αααα αα αααα»α EAV ααΎααααααΆαα»α 2 integer Foreign keys αααα»ααα½αααααα attribute ααααααααΆαα±ααααΆα 8 bytes αααα·ααααααααααααα ααΎαααΈαααααα EAV αααααΆαα»αααααααααααααααααααα·ααΆααα’ααααΆα’ααααα ααααααααα JSONB ααΉαααααΎααα αα·αααααααααΌααΈααα ααΆααααα»αααΆααααα’αΆα ααααΎαα ααΆα ααααααααΆαα±ααααΆαααααΆαααΎαααΌα ααΆαα
αααααα
ααα»ααα αααα»ααα·αααΆααΆααααααΆαα»ααααααααααααααα·α’αααααΆααααα»ααααααα JSONB α’αΆα ααααΎα±ααααΆααα ααΆ αα·αααΆααααααααΆααΌαααααΆααα·ααααααααααα’αααααΆααααααΆααααα½αα ααααα·αααΎα’ααααααα»αααααΎαααΆααααα½αααΆα αααΎα αααααΆααααααΆα’αααΈαααααααααΆααα αααα»αααΆααΆαααΌα ααααΆααΆαα½αααΉαα’αααααΆαααΉαααααΎαααΆαααΆααααααΆαααααα·αααααΆαα α αΎαααΆααα·ααααααΆααΆαααααα½αααααα½αα’αααααααααααΆααα·ααααααααΊααΆααΆαααΌααα½ααα½α αα α αΎα ααα»ααααααΌαααααΆααα·ααααααααααααααΊααΌα ααΆα 3 αααααα»αααα·ααΆαα
ααΌα
ααααΆαααααααα αααααα’ααααΎααΆαααααΎααααααααααΆαα’αα»αααα ααΎαα’αΆα
ααααα·ααααΆαααΆααΆαααΆααααααααΆαα’αα»ααααααΊαα·αααααΆααααααΆααααΆααα αααα»αααααΈαααα JSONB ααΏαααΆα EAV αααααααΎα±ααααΆααΆαααααααααΎαα αααααΆαααΆαααΆααααα αααααααΆααααααΆααΆααα·αααΆαααα·αααααααααααααααααα·αααααΆαααΆααα’αα (α§. α’αααααΆααααααΆααααααααααααααα·αα½αα
ααα½ααα ααΆαααΎαα‘αΎααα½αα±ααααααααααΆααααα
ααα½ααααααααααααααα·αααα·αααααααααααΆαααααΆαα...) ααΌα
ααααααααα·αααΎα’αααααΆαααΆαααααΆαα’αααΈαα·ααΈαααααα’αα½αααΆα , ααΌαααΆαα’αΆααααααααααΈαααα»αααΆααααα
ααααα·!
ααααα: www.habr.com
