TL; DR- JSONB ááẠquery á áœááºážáá±á¬ááºáááºááᯠáááááá¯ááºá á±áá² database schema ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠáá»á¬ážá áœá¬ááá¯ážááŸááºážá á±áááºá
áááá«ááºáž
áááºá ááºáá±áá¬áá±á·á Ạ(áá±áá¬áá±á·á áº) áá±á¬áááŸá¬ ááŸá±ážá¡áá»áá¯á¶áž á¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á áá»á¬ážáá²á០ááŒá áºááá¯ááºáá»á±ááŸááá²á· ááá¹ááááºá¥ááá¬áá áºáá¯ááᯠáá±ážáá«áá á±- áá»áœááºá¯ááºááá¯á·ááœáẠá¡ááŒá±á¬ááºážá¡áá¬áá áºáá¯ááŸáááŒá®ážá á€á¡áá¬á áá¯ááºááá¹áááá»á¬áž (attributes) á¡áá»áá¯á·ááᯠááááºážáááºážááẠááá¯á¡ááºáá«áááºá ááá¯á·áá±á¬áº áá¬áá¬ááºá¡á¬ážáá¯á¶ážááœáẠáá°áá®áá±á¬áá¯ááºááá¹áááá»á¬áž ááŸáááá¯ááºáááºááá¯ááºáá«á ááŸáá·áº áá±á¬ááºáááºáá¯ááºááá¹áááá»á¬ážááᯠá¡áá¬áááºááœáẠáááºáá±á«ááºážááá·áºááá¯ááºáááºá
á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠá¡ááœááºáá°áá¯á¶ážáááºážáááºážááŸá¬ áá á¹á ááºážáááºááá¯ážáá áºáá¯á á®á¡ááœáẠáá±áá¬áá±á·á áºááá¬ážááœáẠáá±á¬áºáá¶áá áºáá¯áááºáá®ážááŒá®áž áááá»áá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá áºáá¯á¡ááœáẠááá¯á¡ááºááá·áºá¡áá¬áá»á¬ážááᯠááá¯ážááŸááºážá áœá¬ááŒáá·áºá áœááºáá«á ááá¯ááºáááº! ááŒá¿áá¬ááŒá±ááŸááºážááŒá®ážááŒá®... ááá·áºááá¬ážááœáẠáááºážáá±á«ááºážáá»á¬ážá áœá¬áá±á¬ ááŸááºáááºážáá»á¬ážáá«ááŸáááŒá®áž ááŸááºáááºážá¡áá áºáá áºáᯠáááºááá·áºááẠááá¯á¡ááºáááºá¡ááá
EAV áá¯á¶á
á¶ááᯠáá¯á¶ážáááºáá« (
ááá¯á·áá±á¬áº EVA áá»ááºážáááºááŸá¯ááœáẠá¡á¬ážáááºážáá»ááºá¡áá»áá¯á·áááŸááá«á á€ááá¯á·á
áºááᯠáá»áœááºá¯ááºáá±ážáááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áº á¥ááá¬á¡á¬ážááŒáá·áºá áá
áºáá¯á
á®ááœáẠáááºááœáŸááºážáá»áẠ1 áá¯áá«áá±á¬ áá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ á¡áá¬áá»á¬ážááᯠááá°ááẠquery ááœáẠáá»áááºáááºááŸá¯ 2 áᯠááá¯á¡ááºáááº- ááááá
áºáá¯ááẠattribute table ááŸáá·áº join ááŒá
áºááŒá®ážá áá¯áááááẠvalues ââtable ááŸáá·áº join áá
áºáá¯ááŒá
áºáááºá á¡áááºá á¡ááœá²á·á¡á
ááºážáá
áºáá¯ááœáẠáááºááœáŸááºážáá»áẠ2 áá¯áá«áá«á áá»áááºáááºááŸá¯ 4 áᯠááá¯á¡ááºáá«áááºá ááá¯á·á¡ááŒááºá áááºááœáŸááºážáá»ááºá¡á¬ážáá¯á¶ážááᯠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº strings áá»á¬ážá¡ááŒá
Ạááááºážáááºážáá¬ážááŒá®áž ááááºááŸáá·áº WHERE clause ááŸá
áºáá¯á
áá¯á¶ážá¡ááœáẠá¡áá»áá¯ážá¡á
á¬ážáá¬á
áºááºááᯠááŒá
áºáá±á«áºá
á±áááºá á¡áááºá áááºááẠáá±ážááœááºážáá»á¬ážá
áœá¬ááᯠáá±ážáá¬ážáá«áá á¡áááºážá¡ááŒá
áºá¡áá¯á¶ážááŒá¯ááŸá¯ááŸáá·áºáááºáááºá áááºážááẠá¡ááœááºááŒá¯ááºážáá®ážááŸá¯ááŒá
áºáááºá
á€áá²á·ááá¯á·áá±á¬ áá»áá¯á·ááœááºážáá»ááºáá»á¬áž ááŸááá±áá±á¬áºáááºáž EAV ááẠá€ááŒá¿áá¬áá»áá¯ážáá»á¬ážááᯠááŒá±ááŸááºážááẠá¡áá»áááºá¡áá±á¬áºááŒá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá áááºážááá¯á·ááẠáááœáŸá²áááŸá±á¬ááºáᬠáá»áá¯á·ááœááºážáá»ááºáá»á¬áž ááŒá
áºá ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á¡ááŒá¬ážááœá±ážáá»ááºá
áᬠáááŸááá±á
ááá¯á·áá±á¬áº PostgreSQL ááœáẠ"áááºážááá¬" á¡áá
áºáá
áºáá¯áá±á«áºáá¬áááºá
PostgreSQL 9.4 ááŒáá·áº á áááºá JSONB áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠJSON ááœááá±áᬠááááºážáááºážááẠááá·áºááœááºážáá²á·áááºá JSON ááᯠá€áá±á¬áºáááºááœáẠááááºážáááºážááŒááºážááẠáá¬áááºá¡á¬ážááŒáá·áº ááá¯ážááá¯ážá á¬áá¬áž JSON ááẠáá±áá¬ááŸáá·áº á¡áá»ááẠá¡áááºážááẠááá¯áá°áá±á¬áºáááºáž áááºážááᯠáá¯ááºáá±á¬ááºááŒááºážááŸá¬ ááá¯ááá¯ááŒááºáááºáá«áááºá JSONB ááẠá á¯á¶á ááºážáá±ážááŒááºážááŸá¯áá»á¬ážááᯠááá¯ááá¯ááŒááºáááºá á±ááá·áº ááœáŸááºážááááºážááŒá¯áá¯ááºááŒááºážááá¯áááºáž áá¶á·ááá¯ážáá±ážáá«áááºá
JSONB áá±áá¬á¡áá»áá¯ážá¡á á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áá»áœááºá¯ááºááá¯á·á entity table ááá¯á· JSONB áá±á¬áºáá¶áá áºáá¯áá»áŸááá·áºááŒááºážááŒáá·áº ááŸá¯ááºááœá±ážáá±á¬ EAV áá¯á¶á á¶ááᯠá¡á á¬ážááá¯ážááá¯ááºá á±ááŒá®áž áá±áá¬áá±á·á áºáá®ááá¯ááºážááᯠáá»á¬ážá áœá¬ááá¯ážááŸááºážá á±áááºá áá«áá±ááá·áº áá±á¬áºáá±á¬áºáá»á¬ážáá»á¬ážá áá«áᬠáá¯ááºáá¯ááºá áœááºážá¡á¬áž áá»áááºážááŒááºážáá²á· ááœá²ááá·áºáááºááá¯á· á á±á¬áááááºááŒáááº... á¡á²áá«ááŒá±á¬áá·áº áá»áœááºáá±á¬áº áá®áá±á¬ááºážáá«ážááᯠáá±ážáá²á·áá«áááºá
á ááºážáááºáá±áá¬áá±á·á áºáá áºáá¯áááºáá±á¬ááºááŒááºážá
á€ááŸáá¯ááºážááŸááºááŸá¯á¡ááœááºá áá»áœááºá¯ááºááẠ$9.5 áááºáá±á¬ááºááŸá¯ááœáẠPostgreSQL 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 tables áá»á¬ážááá¯á· áá±á«ááºážááá·áºáá²á·ááẠ(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"
}
}
ááá¯á·ááŒá±á¬áá·áº ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠááœá±ážáá»ááºá áá¬ááŸá áºáá¯áá¯á¶ážá¡ááœáẠáá°áá®áá±á¬áá±áá¬ááŸááááºá áá¯ááºáááºážááœááºááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááᯠááŸáá¯ááºážááŸááºááŒáá·áºáá¡á±á¬ááºá
ááá·áºáá®ááá¯ááºážááᯠááá¯ážááŸááºážá¡á±á¬ááºáá¯ááºáá«á
áá±áá¬áá±á·á áºáá®ááá¯ááºážááẠá¡ááœááºááá¯ážááŸááºážáááºáᯠááááºááá±á¬áºááŒáá¬ážáááº- EAV á¡ááœáẠááá¬ážáá¯á¶ážáá¯ááá¯áá¯á¶ážááá·áºá¡á á¬áž Properties á¡ááœáẠJSONB áá±á¬áºáá¶ááᯠá¡áá¯á¶ážááŒá¯á ááá¬ážáá áºáá¯á ááá¯á·áá±á¬áº áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááœáẠáááºážááᯠáááºááá¯á·áááºáááºááááºážá áá á¹á ááºážáá áºáá¯á¡á¬áž á¡ááºááááºáá¯ááºááŒááºážááẠá€áá²á·ááá¯á· ááŒá áºáá¯á¶ááááºá
-- 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 ááẠá€áá±áá¬ááœáẠá¡ááá¯ááºááááºá áá»áœááºá¯ááºááá¯á·ááẠJSONB á¡áá¬ááá¹áá¯á០á á¬áá¬ážáááºááá¯ážá¡ááŒá Ạá¡áá±á¬ááºáááẠJSON ->> á¡á±á¬áºááá±áá¬ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá @> á¡á±á¬áºááá±áá¬ááᯠá¡áá¯á¶ážááŒá¯á JSONB áá±á¬áºáááºááœáẠá¡áá¬ážáá°ááááºáááŸáááẠáá¯ááááááºážáááºážáááºáž ááŸááá«áááºá
-- JSONB
SELECT name
FROM entity_jsonb
WHERE properties @> '{"color": "blue"}';
áááºážááẠá¡áááºážáááºááá¯ááŸá¯ááºááœá±ážáááº- áááºážááá¯ááºááá¹áááá±á¬áºáá¶ááŸá JSON á¡áá¬ááá¹áá¯ááœáẠ@> á¡á±á¬áºááá±áá¬á áá¬áááºááœááºááŸááá±á¬ á¡áá¬áá áºáá¯áá«ááŸáááŒááºáž ááŸáá áááŸá á á áºáá±ážááŒáá·áºáá«á áááºááŸá¯ááá¯ááºááŸá¯áááºážááŒá®áž á¡áá»áá¯ážááŒá áºááœááºážááŸá¯ ááá¯áááºážááẠ(á¡á±á¬ááºááœáẠááŒáá·áºáá«)á
Properties á¡áá»á¬ážá¡ááŒá¬ážááᯠáá áºááŒáá¯ááºááẠááœá±ážáá»ááºáááºááá¯á¡ááºáá±á¬á¡áá« JSONB ááá¯ááá¯ááá¯ááœááºáá°á¡á±á¬ááºááŒá¯áá¯ááºááŒáá«á áá¯á·á á€áááºááŸá¬ JSONB áá»ááºážáááºááŸá¯ á¡ááŸááºáááẠáá±á¬ááºááŸááá¬áááº- áá»áœááºá¯ááºááá¯á·ááẠáá»áááºáááºááŸá¯áá»á¬ážáááá¯á¡ááºáá² áá»áœááºá¯ááºááá¯á·áááááºá¡ááœáẠáá±á¬áºáá¶áá»á¬ážá¡ááŒá ẠáááºááŸááºááá·áº á¡ááá¯áá±á¬áºáá¶áá»á¬ážá¡ááŒá Ạáá¯ááºááá¹áááá»á¬ážááᯠááœá±ážáá»ááºáááº-
-- JSONB
SELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
EAV ááŒáá·áº áááºáá±ážááŒááºážááá¯áá±á¬ áá
á¹á
ááºážáá
áºáá¯á
á®á¡ááœáẠJoin 2 áᯠááá¯á¡ááºáá«áááºá áá»áœááºá¯ááºáá¡ááŒááºá¡áá á¡áááºáá±á¬áºááŒáá«áá±ážááœááºážáá»á¬ážááẠáá±áá¬áá±á·á
áºáá®ááá¯ááºážááœáẠá¡ááœááºááá¯ážááŸááºážááŸá¯ááá¯ááŒááááºá JSONB ááá¯á· queries áá±ážáááºážá áá±á¬ááºáááºááá°áá¬áá»á¬ážááá¯áááºáž ááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
á¡áá¯á Performance á¡ááŒá±á¬ááºážááŒá±á¬ááá¯á·á¡áá»áááºáá±á¬ááºááŒá®á
ááœááºááá¯ááºáá±áž
á
áœááºážáá±á¬ááºáááºááᯠááŸáá¯ááºážááŸááºááá¯á· áá»áœááºáá±á¬áºáá¯á¶ážáááºá
áá±áá¬á¡ááºááááºááẠá¡áá»áááºáá¬ááááºááŸááºáá»áẠ(ms in) ááœáẠá¡á±á¬ááºáá«ááááºáá»á¬ážááᯠááŒááá²á·áááºá á áá±ážááẠáá±á¬á·ááá áºáááºááŒá áºáááºááᯠáááááŒá¯áá«á
á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬á¡ááŒá±á¬ááºážááŒáá»ááºááŒá±á¬áá·áº á¡ááœáŸááºážáá»á¬ážááá¯á¡áá¯á¶ážáááŒá¯áá«á JSONB ááẠEAV ááẠ(> 50000-x) ááá¯ááŒááºáááºááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºááá®ážáá»á¬ážááŒáá·áº áá±á¬áºáá¶áá»á¬ážááᯠááœáŸááºážáá±á¬á¡áá«á ááœá¬ááŒá¬ážáá»ááºááŸá¬ áá»á±á¬ááºááœááºáá¯áá®ážáá«ážááŒá
áºáá±á¬áºáááºáž JSONB ááẠEAV ááẠ1,3 á ááá¯ááŒááºáá±áá±ážáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá²ááŒááºááŸá¯á
á¶áááºááŸááºáá»ááºáá»á¬ážááœáẠááá¯ááºááá¯ááºááŸá¯áá±á¬áºáá¶ááᯠá¡áá¯á¶ážáááŒá¯áá±á¬ááŒá±á¬áá·áº JSONB áá±á¬áºáá¶ááŸá á¡ááœáŸááºážááẠá€áá±áá¬ááœáẠáááºáá±á¬ááºááŸá¯áááŸáááŒá±á¬ááºáž áááááŒá¯áá«á
ááá¯ááºááá¯ááºááŸá¯áááºááá¯ážáá±á«áºáá°áááºá áá±áá¬ááœá±ážáá»ááºááŒááºážá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«ááááºáá»á¬áž (áá¬áááºá áá±áž) ááᯠáááŸááááº-
JSONB ááẠá¡ááœáŸááºážáá»á¬ážááá«áá² EAV áááºááá¯ááá¯ááŒááºáááºá
áœá¬á¡áá¯ááºáá¯ááºáááºááᯠáááºáááááŒá¯ááááá¯ááºáá±á¬áºáááºáž EAV ááẠá¡ááœáŸááºážáá»á¬ážáá«ááŸáááá·áºá¡áá»áááºááœáẠJSONB áááºááá¯ááá¯ááŒááºáááºá
áœá¬á¡áá¯ááºáá¯ááºáá±áá±ážáááºá áá«áá±ááá·áº JSONB áá±ážááŒááºážáá»ááºááœá±á¡ááœáẠá¡áá»áááºááœá±á á¡áá°áá°áá«áá²ááá¯á· áá»áœááºáá±á¬áºááŒááºáá²á·áááºá áá«á GIN á¡ááœáŸááºážááááºážááœá± á¡áá¯ááºááá¯ááºáá±á¬á·áá°ážááá¯áᬠááááá¯ááºááááºá áá°áá±áá°áááºááá·áº áá¯ááºááá¹áááá»á¬ážáá«ááŸááá±á¬ áá±á¬áºáá¶áá
áºáá¯áá±á«áºááœáẠGIN á¡ááœáŸááºážááᯠáááºá¡áá¯á¶ážááŒá¯áá±á¬á¡áá«ááœáẠáá«áááºááá·áº á¡á±á¬áºááá±áᬠ@> ááá¯á¡áá¯á¶ážááŒá¯ááá·áºá¡áá«ááŸáᬠá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááŸááááºááŒá
áºáááºá áááºážááᯠá
ááºážáááºááŸá¯á¡áá
áºááœáẠáá»áœááºáá±á¬áºá¡áá¯á¶ážááŒá¯áá²á·ááŒá®áž áááºážááẠá¡áá»áááºá¡áá±á«áº ááŒá®ážáá¬ážáá±á¬á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááŸááá²á·áááº- 0,153ms áá¬ááŸááááºá áááºážááẠEAV ááẠá¡á 15000 ááá¯ááŒááºááŒá®áž -->> á¡á±á¬áºááá±áá¬ááẠá¡á 25000 ááá¯ááŒááºáááºá
áá¯á¶áá±á¬ááºááŒá®áááºáááº!
áá±áá¬áá±á·á áºááá¬ážá¡ááœááºá¡á á¬áž
áááºážáááºážááŸá áºáá¯áá¯á¶ážá¡ááœáẠááá¬ážá¡ááœááºá¡á á¬ážááᯠááŸáá¯ááºážááŸááºááŒáá·áºáá¡á±á¬ááºá psql ááœááºáá»áœááºá¯ááºááá¯á·ááẠcommand ááá¯á¡áá¯á¶ážááŒá¯á ááá¬ážáá»á¬ážááŸáá·áºá¡ááœáŸááºážáá»á¬ážá¡á¬ážáá¯á¶ážáá¡ááœááºá¡á á¬ážááá¯ááŒáááá¯ááºáááºá dti+
EAV áá»ááºážáááºááŸá¯á¡ááœááºá ááá¬ážá¡ááœááºá¡á
á¬ážáá»á¬ážááẠ3068 MB áááºážáá»ááºááŸáááŒá®áž á
á¯á
á¯áá±á«ááºáž 3427 GB á¡ááœáẠá¡ááœáŸááºáž 6,43 MB á¡ááááŸááááºá JSONB áá»ááºážáááºááŸá¯ááẠááá¬ážá¡ááœáẠ1817 MB ááŸáá·áº 318 GB ááŒá
áºááá·áº á¡ááœáŸááºážááááºážáá»á¬ážá¡ááœáẠ2,08 MB ááá¯á¡áá¯á¶ážááŒá¯áááºá 3 á áá»á±á¬á·áááºážááœá¬ážááẠá áá»áœááºá¯ááºááá¯á·ááẠJSONB á¡áá¬ááá¹áá¯ááá¯ááºážááœáẠááá¯ááºááá¯ááºááŸá¯á¡áááºáá»á¬ážááᯠááááºážáááºážáá¬ážáá±á¬ááŒá±á¬áá·áº á€á¡áá»ááºá áá»áœááºá¯ááºááᯠá¡áááºážááẠá¡á¶á·á¡á¬ážááá·áºá
á±áá«áááºá
ááá¯á·áá±á¬áºá áá¶áá«ááºáá»á¬ážááẠáááºážááá¯á·á¡ááœáẠááŒá±á¬ááá¯áá±ááŒáááº- EAV ááœáẠáá»áœááºá¯ááºááá¯á·ááẠattribute value áá áºáá¯áá»áŸáẠinteger Foreign keys 2 áá¯ááᯠááááºážáááºážáá¬ážááŒá®áž á¡ááá¯áá±áᬠ8 bytes áááŸáá á±áááºá ááá¯á·á¡ááŒáẠEAV ááẠááá¯ááºááá¯ááºááŸá¯áááºááá¯ážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠá á¬áá¬ážá¡ááŒá Ạááááºážáááºážáá¬ážááŒá®áž JSONB ááẠááŒá áºááá¯ááºáá«á ááááºážááá¬ááºážááŸáá·áº áá°áá®áá¶áááºááá¯ážáá»á¬ážááᯠá¡ááœááºážááá¯ááºážá á¡áá¯á¶ážááŒá¯áááºááŒá áºááŒá®áž ááá¯ááá¯áá±ážáááºáá±á¬ááŒá±áá¬ááᯠáááŸáá á±áááºááŒá áºáááºá
ááááºáá»á¬ážááá¯
áá±áá°áá»á¡á¬ážááŒáá·áºá JSONB áá±á¬áºáááºááœáẠentity áá¯ááºááá¹áááá»á¬ážááᯠááááºážáááºážááŒááºážááẠááá·áºáá±áá¬áá±á·á áºááᯠáá®ááá¯ááºážááœá²ááŒááºážááŸáá·áº ááááºážááááºážááŒááºážááᯠááá¯ááá¯ááœááºáá°á á±áááºáᯠáá»áœááºá¯ááºáááºáá«áááºá á¡áááºá áááºááẠáá±ážááœááºážáá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºáá±áá«áá á¡áá¬áááºááááºážááᯠááá¬ážáá áºáá¯áááºážááœáẠáá¬ážááŸáááŒááºážá á¡ááŸááºáááẠááá¯ááá¯áááá±á¬ááºá áœá¬ áá¯ááºáá±á¬ááºááá¯ááºáááºááŒá áºáááºá áá±áá¬áá»á¬ážááŒá¬áž á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááᯠááá¯ážááŸááºážá á±ááá·áºá¡áá»ááºááŸá¬ á¡áá±á«ááºážááŒá áºáá±ááŒá®ááŒá áºáá±á¬áºáááºáž ááááºáá±áá¬áá±á·á áºááẠáá¯áááºááœáẠá á ááá¯áá±ážáááºáááºá
ááá¯á·á¡ááŒááºá áá¯ááºáá±á¬ááºáá²á·áá±á¬ á
ááºážáááºááŸá¯áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á á
áœááºážáá±á¬ááºááẠáá¯á¶ážááŸá¯á¶ážááŸá¯áá»á¬ážááẠá¡ááœááºá¡áá±ážááá«ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á· áá±á¬ááºáá»ááºáá»ááá¯ááºáá«áááºá á¡áá»áá¯á·ááá
á¹á
áá»á¬ážááœááºá JSONB ááẠEAV áááºááẠááá¯ááŒááºáá±á¬ááŒá±á¬áá·áº áááºážááᯠááá¯áá±á¬ááºážá
á±áááºá ááá¯á·áá±á¬áºá á€á
á¶ááŸá¯ááºážááẠááá¹áá¡á¬ážáá¯á¶ážááᯠá¡áá»á¯á¶ážáááºáááºááá¯ááºáá« (á¥ááá¬- áá¯ááºááá¹áááá»á¬ážá
áœá¬ááŸááá±á¬ á¡áá¬áá»á¬ážá ááŸáááŒá®ážáá¬ážáá±áá¬áá»á¬ážá áá¯ááºááá¹ááá¡áá±á¡ááœáẠáááááá¬áá¬ááá¯ážáá¬ááŒááºážá...)á ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠá¡ááŒá¶ááŒá¯áá»ááºáá»á¬ážááŸááá«á ááá·áºááœááºá áá»á±ážáá°ážááŒá¯á ááŸááºáá»ááºáá»á¬ážááœááºáá»ááºáá¬ážáá²á·áá«á
source: www.habr.com