์์ฝ: JSONB๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ ํ์ํค์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๊ฐ๋ฐ์ ํฌ๊ฒ ๋จ์ํํ ์ ์์ต๋๋ค.
์๊ฐ
๊ด๊ณํ DB(๋ฐ์ดํฐ๋ฒ ์ด์ค) ์ธ๊ณ์์ ์๋ง๋ ๊ฐ์ฅ ์ค๋๋ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋์ธ ๊ณ ์ ์ ์ธ ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ํฐํฐ๊ฐ ์๊ณ , ์ด ์ํฐํฐ์ ํน์ ์์ฑ(์์ฑ)์ ์ ์ฅํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋์ผํ ์์ฑ ์งํฉ์ ๊ฐ๋ ๊ฒ์ ์๋๋ฉฐ, ์์ผ๋ก ๋ ๋ง์ ์์ฑ์ด ์ถ๊ฐ๋ ์๋ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ DB ํ ์ด๋ธ์ ๊ฐ ์์ฑ ๊ฐ์ ๋ํ ์ด์ ๋ง๋ค๊ณ ํน์ ์ํฐํฐ ์ธ์คํด์ค์ ํ์ํ ๊ฐ๋ง ์ ๋ ฅํ๋ ๊ฒ์ ๋๋ค. ์ข์ต๋๋ค! ๋ฌธ์ ๋ ํด๊ฒฐ๋์์ต๋๋ค... ํ ์ด๋ธ์ ์๋ฐฑ๋ง ๊ฐ์ ๋ ์ฝ๋๊ฐ ์๊ณ ์ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ ๋๊น์ง๋ ๋ง์ด์ฃ .
EAV ํจํด์ ๊ณ ๋ คํด ๋ณด์(), ์ด๋ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ํ ํ
์ด๋ธ์๋ ์ํฐํฐ(๋ ์ฝ๋)๊ฐ ์๊ณ , ๋ค๋ฅธ ํ
์ด๋ธ์๋ ์์ฑ ์ด๋ฆ(์์ฑ)์ด ์์ผ๋ฉฐ, ์ธ ๋ฒ์งธ ํ
์ด๋ธ์๋ ์ํฐํฐ์ ํด๋น ์์ฑ์ ์ฐ๊ฒฐํ๊ณ ํ์ฌ ์ํฐํฐ์ ๋ํ ํด๋น ์์ฑ ๊ฐ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ๊ฐ์ฒด์ ๋ํด ์๋ก ๋ค๋ฅธ ์์ฑ ์งํฉ์ ์ฌ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ "์ฆ์" ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง EVA ๋ฐฉ์์ ๋จ์ ์ด ์๋ค๋ฉด ์ด ๊ธ์ ์ฐ์ง ์์์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๊ฐ ํ๋์ ์์ฑ์ ๊ฐ์ง ํ๋ ์ด์์ ์ํฐํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ฟผ๋ฆฌ์ ๋ ๊ฐ์ ์กฐ์ธ์ด ํ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์์ฑ ํ
์ด๋ธ๊ณผ์ ์กฐ์ธ์ด๊ณ , ๋ ๋ฒ์งธ๋ ๊ฐ ํ
์ด๋ธ๊ณผ์ ์กฐ์ธ์
๋๋ค. ์ํฐํฐ์ ์์ฑ์ด ๋ ๊ฐ ์์ผ๋ฉด ์กฐ์ธ ๋ค ๊ฐ๊ฐ ํ์ํฉ๋๋ค! ๊ฒ๋ค๊ฐ ๋ชจ๋ ์์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์ด๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ WHERE ์กฐ๊ฑด ๋ชจ๋์ ํ๋ณํ์ด ํ์ํฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ๋ง์ด ์์ฑํ๋ฉด ๋ฆฌ์์ค ์ฌ์ฉ ์ธก๋ฉด์์ ๋งค์ฐ ๋ญ๋น์ ์
๋๋ค.
์ด๋ฌํ ๋ช
๋ฐฑํ ๋จ์ ์๋ ๋ถ๊ตฌํ๊ณ EAV๋ ์ค๋ซ๋์ ์ด๋ฌํ ์ข
๋ฅ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋์ด ์์ต๋๋ค. ์ด๋ ๋ถ๊ฐํผํ ๋จ์ ์ด์๊ณ , ๋ ๋์ ๋์์ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ PostgreSQL์ ์๋ก์ด "๊ธฐ์ "์ด ๋ฑ์ฅํ์ต๋๋ค.
PostgreSQL 9.4๋ถํฐ ๋ฐ์ด๋๋ฆฌ JSON ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด JSONB ๋ฐ์ดํฐ ์ ํ์ด ์ถ๊ฐ๋์์ต๋๋ค. JSONB ํ์์ผ๋ก JSON์ ์ ์ฅํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ฐ ํ ์คํธ JSON๋ณด๋ค ๊ณต๊ฐ๊ณผ ์๊ฐ์ด ์ฝ๊ฐ ๋ ๋ง์ด ์์๋์ง๋ง, ์์ ์ํ ์๋๋ ํจ์ฌ ๋น ๋ฆ ๋๋ค. JSONB๋ ์ธ๋ฑ์ฑ๋ ์ง์ํ์ฌ ์ฟผ๋ฆฌ ์๋๊ฐ ๋์ฑ ๋นจ๋ผ์ง๋๋ค.
JSONB ๋ฐ์ดํฐ ์ ํ์ ์ฌ์ฉํ๋ฉด ์ํฐํฐ ํ ์ด๋ธ์ JSONB ์ด ํ๋๋ง ์ถ๊ฐํ์ฌ ๋ฒ๊ฑฐ๋ก์ด EAV ํจํด์ ๋์ฒดํ ์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๋ฅผ ํฌ๊ฒ ๊ฐ์ํํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ์ด๋ฌํ ๋ฐฉ์์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋ฐ๋ก ์ด๋ฌํ ์ด์ ๋ก ์ด ๊ธ์ ์ผ์ต๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
์ด ๋น๊ต๋ฅผ ์ํด $9.5 ๋น๋์์ PostgreSQL 80๋ฅผ ์๋ก ์ค์นํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. 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
);
ํจ์ฌ ๊ฐ๋จํด ๋ณด์ด์ง ์๋์? ๊ทธ๋ฐ ๋ค์ ์ํฐํฐ ํ ์ด๋ธ์ ์ถ๊ฐ๋์์ต๋๋ค(์ค์ฌ & ์ํฐํฐ_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"
}
}์ด์ ๋ ์ต์ ์ ๋ํด ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. ์ค์ ๊ตฌํ์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค!
๋์์ธ ๋จ์ํ
์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๊ฐ ํฌ๊ฒ ๊ฐ์ํ๋์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. EAV์ ์ธ ๊ฐ์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๋์ , ์์ฑ์ 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 ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ ๊ฐ์ 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 ๋ชจ๋ธ์์ @> ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
-- JSONB
SELECT name
FROM entity_jsonb
WHERE properties @> '{"color": "blue"}';
์ด ๋ฐฉ๋ฒ์ ์ข ๋ ๋ณต์กํฉ๋๋ค. properties ์ด์ JSON ๊ฐ์ฒด์ @> ์ฐ์ฐ์ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค. ๊ฐ๋ ์ฑ์ ๋จ์ด์ง์ง๋ง ์ฑ๋ฅ์ ๋ ์ข์ต๋๋ค(์๋ ์ฐธ์กฐ).
์ฌ๋ฌ ์์ฑ์ ํ ๋ฒ์ ์ ํํด์ผ ํ ๋ JSONB๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด ๋ณด๊ฒ ์ต๋๋ค. JSONB ์ ๊ทผ ๋ฐฉ์์ด ์ง์ ์ผ๋ก ๋น์ ๋ฐํ๋ ๋ถ๋ถ์ ๋ฐ๋ก ์ด ๋ถ๋ถ์ ๋๋ค. ์กฐ์ธ ์์ด ๊ฒฐ๊ณผ ์งํฉ์์ ์์ฑ์ ์ถ๊ฐ ์ด๋ก ์ ํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
-- JSONB
SELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
EAV๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌํ๋ ค๋ ๊ฐ ์์ฑ์ ๋ํด ๋ ๊ฐ์ ์กฐ์ธ์ด ํ์ํฉ๋๋ค. ์ ์๊ฐ์๋ ์์ ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๋ฅผ ํฌ๊ฒ ๋จ์ํํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. JSONB ์ฟผ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋ง์ ์์๋ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฐํธ.
์ด์ ์ฑ๋ฅ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
ะัะพะธะทะฒะพะดะธัะตะปัะฝะพััั
๋ด๊ฐ ์ฌ์ฉํ ์ฑ๋ฅ์ ๋น๊ตํ๋ ค๋ฉด ์ฟผ๋ฆฌ์์ ์คํ ์๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ์ธ ๋ฒ ์คํํ์ต๋๋ค. ์ฟผ๋ฆฌ ํ๋๋๊ฐ ์ฒ์ ์คํํ ๋ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋จผ์ ์ธ๋ฑ์ค ์์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ต๋๋ค. EAV์ ํ์ํ ์กฐ์ธ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์(์ธ๋ ํค ํ๋์ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ง ์์๊ธฐ ๋๋ฌธ์) JSONB์ ์ฅ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ํ EAV ๊ฐ ํ ์ด๋ธ์ ๋ ์ธ๋ ํค ์ด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ , JSONB ์ด์ ๋ํ.
๋ฐ์ดํฐ ์๋ก ๊ณ ์นจ ๊ฒฐ๊ณผ ์๊ฐ(ms)์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋จ์๋ ๋์์ ์ ๋๋ค.

์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ JSONB๊ฐ ์์์ ์ธ๊ธํ ์ด์ ๋ก EAV๋ณด๋ค ํจ์ฌ(>50000-x) ๋ ๋น ๋ฅธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ํค ์ด์ ์ธ๋ฑ์ฑํ๋ฉด ์ฐจ์ด๊ฐ ๊ฑฐ์ ์ฌ๋ผ์ง์ง๋ง, JSONB๋ ์ฌ์ ํ EAV๋ณด๋ค 1,3๋ฐฐ ๋ ๋น ๋ฆ
๋๋ค. ์ฌ๊ธฐ์๋ JSONB ์ด์ ์ธ๋ฑ์ค๊ฐ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ฐ, ์ด๋ ํ๊ฐ ๊ธฐ์ค์์ ์์ฑ ์ด์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ฑ ๊ฐ์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค(์ ๊ท ์ฒ๋).

JSONB๊ฐ ์ธ๋ฑ์ค๊ฐ ์์ ๋๋ EAV๋ณด๋ค ๋น ๋ฅด์ง๋ง, EAV์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ๋ฉด JSONB๋ณด๋ค ์ฌ์ ํ ๋น ๋ฆ
๋๋ค. ๊ทธ๋ฐ๋ฐ JSONB ์ฟผ๋ฆฌ์ ์คํ ์๊ฐ์ด ๋์ผํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , ์ด๋ฅผ ํตํด GIN ์ธ๋ฑ์ค๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ง ์๋๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. ์์ฑ์ด ์ฑ์์ง ์ด์ GIN ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋๋ ํฌํจ ์ฐ์ฐ์ @>๋ฅผ ์ฌ์ฉํด์ผ๋ง ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ํ
์คํธ์์ ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋๋ ์คํ ์๊ฐ์ ์์ฒญ๋ ์ฐจ์ด๊ฐ ๋ํ๋ฌ์ต๋๋ค. ๋จ 0,153ms! ์ด๋ EAV๋ณด๋ค 15000๋ฐฐ, ->> ์ฐ์ฐ์๋ณด๋ค 25000๋ฐฐ ๋น ๋ฅธ ์๋์
๋๋ค.
๊ฝค ๋น ๋ฅธ ๊ฒ ๊ฐ์์!
DB ํ ์ด๋ธ ํฌ๊ธฐ
๋ ์ ๊ทผ ๋ฐฉ์์ ํ ์ด๋ธ ํฌ๊ธฐ๋ฅผ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค. psql์์๋ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ ์ด๋ธ๊ณผ ์ธ๋ฑ์ค์ ํฌ๊ธฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋ํฐ+

EAV ๋ฐฉ์์ ๊ฒฝ์ฐ ํ
์ด๋ธ ํฌ๊ธฐ๋ ์ฝ 3068MB์ด๊ณ ์ธ๋ฑ์ค๋ ์ต๋ 3427MB๋ก ์ด 6,43GB์
๋๋ค. JSONB ๋ฐฉ์์ ํ
์ด๋ธ์ 1817MB, ์ธ๋ฑ์ค์ 318MB๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ 2,08GB์ ํด๋นํฉ๋๋ค. ์ด๋ 3๋ฐฐ๋ ์ ์ ์ฉ๋์
๋๋ค! ๊ฐ JSONB ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ด ์ฌ์ค์ ๋ค์ ๋๋์ต๋๋ค.
ํ์ง๋ง ์ซ์๋ง ๋ด๋ ์ ์ ์์ต๋๋ค. EAV์์๋ ์์ฑ ๊ฐ๋น 2๊ฐ์ ์ ์ ์ธ๋ ํค๋ฅผ ์ ์ฅํ์ฌ 8๋ฐ์ดํธ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. ๋ํ EAV์์๋ ๋ชจ๋ ์์ฑ ๊ฐ์ด ํ ์คํธ๋ก ์ ์ฅ๋๋ ๋ฐ๋ฉด, JSONB๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ์ซ์ ๋ฐ ๋ถ์ธ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ ์์ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.
๊ฒฐ๊ณผ
์ ๋ฐ์ ์ผ๋ก JSONB์ ์ํฐํฐ ์์ฑ์ ์ ์ฅํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๋ฐ ์ ์ง ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์์ํด์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ๋ง์ด ์ํํ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ํญ๋ชฉ์ ์ํฐํฐ์ ๋์ผํ ํ ์ด๋ธ์ ์ ์ฅํ๋ฉด ์ค์ ๋ก ๋ ํจ์จ์ ์ผ๋ก ์๋ํฉ๋๋ค. ๋ฐ์ดํฐ ์ํธ์์ฉ์ด ๊ฐ์ํ๋๋ค๋ ์ ๋ ์ฅ์ ์ด์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฌ๊ธฐ๊ฐ 3๋ฐฐ ๋ ์์์ง๋๋ค.
๋ํ, ์ ํฌ๊ฐ ์ํํ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฑ๋ฅ โโ์ ํ๊ฐ ๋งค์ฐ ๋ฏธ๋ฏธํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ JSONB๊ฐ EAV๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ฑ ์ฐ์ํฉ๋๋ค. ํ์ง๋ง ์ด ๋ฒค์น๋งํฌ๊ฐ ๋ชจ๋ ์ธก๋ฉด(์: ๋งค์ฐ ๋ง์ ์์ฑ์ ๊ฐ์ง ์ํฐํฐ, ๊ธฐ์กด ๋ฐ์ดํฐ์ ์์ฑ ์ ๋ํญ ์ฆ๊ฐ ๋ฑ)์ ํฌ๊ดํ๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ฐฉ์์ ๋ํ ์ ์์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์!
์ถ์ฒ : habr.com
