์ฐ๋ฆฌ๋ ์์ ์ ์ ์ฅํ๊ธฐ ์ํ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ค๊ณํ์ต๋๋ค. 1๋ ์ด ์ง๋ฌ๊ณ ์ฌ์ฉ์๋ค์ด ์ ๊ทน์ ์ผ๋ก ์ด๋ฅผ ์ฑ์ฐ๊ณ ์์ผ๋ฉฐ ์ด๋ฏธ ์๋ฐฑ๋ง ๊ฐ์ ๋ ์ฝ๋, ๊ทธ๋ฆฌ๊ณ ... ๋ฌด์ธ๊ฐ๊ฐ ๋๋ ค์ง๊ธฐ ์์ํ์ต๋๋ค.
- 2๋ถ: "๋ผ์ด๋ธ" ์น์ ํ

๊ทธ๊ฑด ์ฌ์ค์
๋๋ค ํ
์ด๋ธ ํฌ๊ธฐ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ธ๋ฑ์ค์ "๊น์ด"๋ ์ปค์ง๋๋ค. โ ๋์์ ์ผ๋ก๋ผ๋์. ๊ทธ๋ฌ๋ ์๊ฐ์ด ์ง๋๋ฉด์ ์๋ฒ๋ ๋์ผํ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์
์ ์ํํด์ผ ํฉ๋๋ค. ๋ช ๋ฐฐ ๋ ๋ง์ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค์ฒ์๋ณด๋ค.
์ฌ๊ธฐ๊ฐ ๊ตฌ์ถ์ ํ์ฅ์
๋๋ค ์น์
ํ.
์ฐ๋ฆฌ๊ฐ ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์ค๋ฉ, ์ฆ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐํ๋ ๊ฒ์ ๋ํ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ์ ์ํ์ธ์. ์๋ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋๋์ด๋ ์ฌ๋ฌ ์๋ฒ๋ฅผ ์ฌ์ฉํด๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ธ๋ฑ์ค๊ฐ "๋ถํ์ด ์ค๋ฅด๋" ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋งค์ผ ์๋ก์ด ์๋ฒ๋ฅผ ๊ฐ๋ํ ์ฌ๋ ฅ์ด ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ด์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตญํ๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ๋ถ๋ช
ํฉ๋๋ค.
์ฐ๋ฆฌ๋ "ํ๋์จ์ด"์์ ์น์ ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ , ์ ๊ทผ ๋ฐฉ์ ์์ฒด, ์ฆ ๋ฌด์์ ์ด๋ป๊ฒ "์กฐ๊ฐ์ผ๋ก ์๋ผ์ผ" ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ ์๊ตฌ๊ฐ ๋ฌด์์ผ๋ก ์ด์ด์ง๋์ง์ ๋ํด์๋ง ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
๊ฐ๋
๋ค์ ํ๋ฒ ๋ชฉํ๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค. ์ค๋, ๋ด์ผ ๊ทธ๋ฆฌ๊ณ 1๋ ํ์๋ PostgreSQL์์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ ์ํด ์ฝ๋ ๋ฐ์ดํฐ ์์ด ๊ฑฐ์ ๋์ผํ๊ฒ ์ ์ง๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ค ๊ฒ์ ๋ํด์๋ ์ฐ๋์์ผ๋ก ๋์ ๋ ๋ฐ์ดํฐ (๋ฉ์์ง, ๋ฌธ์, ๋ก๊ทธ, ์์นด์ด๋ธ ๋ฑ) ํํฐ์ ํค๋ก ์์ฐ์ค๋ฝ๊ฒ ์ ํ๋๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํ์ฌ ๋ ์ง/์๊ฐ. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๊ทธ๋ฌํ ์ด๋ฒคํธ๋ ๋ฉ์์ง๊ฐ ์ ์ก๋ ์๊ฐ.
์ฌ์ฉ์๋ ๊ฑฐ์ ํญ์ "์ต์ "์ผ๋ก๋ง ์์ ํ์ธ์ ์ด๋ฐ ๋ฐ์ดํฐ - ๊ทธ๋ค์ ์ต์ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ , ์ต์ ๋ก๊ทธ๋ฅผ ๋ถ์ํฉ๋๋ค... ์๋์, ๋ฌผ๋ก , ๊ทธ๋ค์ ์๊ฐ์ ๊ฑฐ์ฌ๋ฌ ์คํฌ๋กคํ ์๋ ์์ง๋ง, ๊ทธ๋ด ์ผ์ ๊ฑฐ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ์ฝ์กฐ๊ฑด์์ ๋ฉ์์ง์ ๋ํ ์ต์ ์ ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํด์ง๋๋ค. "๋งค์ผ" ์น์ โ ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ ์ฌ์ฉ์๋ ํญ์ "์ค๋"์ด๋ "์ด์ " ๋ฐ์ ๋ด์ฉ์ ์ฝ์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ๋ฃจ ์ค ์ค์ง์ ์ผ๋ก ํ ์น์ ๋ง ์ฐ๊ณ ์ฝ๋๋ค๋ฉด ์ด๊ฒ๋ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ์ ๋ ํจ์จ์ ์ธ ์ฌ์ฉ โ ํ ์ด๋ธ ์ ์ฒด์ ์๋ "ํฌ๊ณ ๊ตต์" ์ธ๋ฑ์ค์ ๋ฌ๋ฆฌ ๋ชจ๋ ์น์ ์ธ๋ฑ์ค๋ RAM์ ์ฝ๊ฒ ๋ค์ด๊ฐ๋๋ค.
๋จ๊ณ๋ณ
์ ๋ฐ์ ์ผ๋ก ์์์ ์ธ๊ธํ ๋ด์ฉ์ ๋ชจ๋ ํฐ ์ด์ต์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ฌ์ฑ ๊ฐ๋ฅํ์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ์ํฐํฐ ์ค ํ๋๋ฅผ ๋ถํ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ๊ด๋ จ๋ ์ํฐํฐ๋ฅผ "๋ณผ" ํ์์ฑ์ด ๋ฐ์ํฉ๋๋ค..
๋ฉ์์ง, ๊ทธ ์์ฑ ๋ฐ ํฌ์
๋ ์ง๋ณ๋ก ๋ฉ์์ง๋ฅผ ์๋ผ๋ด๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฉ์์ง์ ์ข ์๋ ์ํฐํฐ ์์ฑ(์ฒจ๋ถ ํ์ผ, ์์ ์ ๋ชฉ๋ก)๋ ๋ถํ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ๋ฉ์์ง ๋ ์ง๋ก๋.
์ผ๋ฐ์ ์ธ ์ ๋ฌด ์ค ํ๋๊ฐ ๋ฉ์์ง ๋ฑ๋ก๋ถ(์ฝ์ง ์์, ์์ , ๋ชจ๋)๋ฅผ ๋ณด๋ ๊ฒ์ด๋ฏ๋ก, ์ด๋ฅผ ๋ฉ์์ง ๋ ์ง๋ณ๋ก ์น์ ์ผ๋ก ๋๋์ด "์์ฑ"ํ๋ ๊ฒ๋ ๋ ผ๋ฆฌ์ ์ ๋๋ค.

๋ชจ๋ ํ ์ด๋ธ(์์ ์, ํ์ผ, ๋ ์ง์คํธ๋ฆฌ)์ ํํฐ์ ํค(๋ฉ์์ง ๋ ์ง)๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ฉ์์ง ์์ฒด์ ์ถ๊ฐํ ํ์๋ ์์ง๋ง ๊ธฐ์กด DateTime์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ค๋ ๋
์ฃผ์ ๊ฐ ์ฌ๋ฌ ๋ฉ์์ง์ ๋ํ ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๋์ผํ ๋ชจ๋ธ์์ "์๋ผ๋ด๊ธฐ"๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒ์ ์์งํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์๋ฒฝํฉ๋๋ค ์์ ์ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง ๋ ์ง โ ์ฆ, ์ฃผ์ ์์ฒด๊ฐ ์์ฑ๋๋ ์๊ฐ์ ๋๋ค.

๋ชจ๋ ํ ์ด๋ธ์ ํํฐ์ ํค(์ฃผ์ ๋ ์ง)๋ฅผ ์ถ๊ฐํฉ๋๋ค: ์ฃผ์ , ์ฐธ์ฌ์.
ํ์ง๋ง ์ด์ ์ฐ๋ฆฌ๋ ๋์์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋์์ต๋๋ค.
- ํด๋น ์ฃผ์ ์ ๋ํ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ์ด๋ ์น์ ์ ์ ํํด์ผ ํฉ๋๊น?
- ์ด๋ ์น์ ์์ ๋ฉ์์ง ์ฃผ์ ๋ฅผ ์ฐพ์์ผ ํฉ๋๊น?
๋ฌผ๋ก , ๋ชจ๋ ์น์ ์ ๊ณ์ ๊ฒ์ํ ์๋ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ๋ฉด ๋งค์ฐ ์ํ๊น์ด ์ผ์ด๊ณ ์ฐ๋ฆฌ๊ฐ ์ป์ ๋ชจ๋ ์๊ธ์ด ๋ฌดํจํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ํํ ์ด๋๋ฅผ ์ดํด๋ด์ผ ํ ์ง ์๊ธฐ ์ํด ์น์ ์ ๋ํ ๋ ผ๋ฆฌ์ ๋งํฌ/ํฌ์ธํฐ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฉ์์ง์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค ์ฃผ์ ๋ ์ง ํ๋
- ์ฃผ์ ์ ์ถ๊ฐํด ๋ณด์ ๋ฉ์์ง ๋ ์ง ์งํฉ ์ด๋ฌํ ๋์(๋ณ๋์ ํ ๋๋ ๋ ์ง ๋ฐฐ์ด์ผ ์ ์์)

๊ฐ ๊ฐ๋ณ ์์ ์ ๋ฉ์์ง ๋ ์ง ๋ชฉ๋ก์๋ ๊ฑฐ์ ์์ ์ฌํญ์ด ์์ผ๋ฏ๋ก(๊ฒฐ๊ตญ ๊ฑฐ์ ๋ชจ๋ ๋ฉ์์ง๊ฐ 1~2์ผ ์ด๋ด์ ๋์ฐฉํจ) ์ด ์ต์
์ ์ค์ ์ ๋๊ฒ ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ์ฐ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ ํํฐ์ ๋์ ๊ณ ๋ คํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ถ๊ฒ ๋์์ต๋๋ค.
ํ ์ด๋ธ: RU, ํ ์ด๋ธ/ํ๋ ์ด๋ฆ์ ํค๋ฆด ๋ฌธ์๊ฐ ์ซ๋ค๋ฉด ์ฐพ์๋ณด์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
-- ัะตะบัะธะธ ะฟะพ ะดะฐัะต ัะพะพะฑัะตะฝะธั
CREATE TABLE "ะกะพะพะฑัะตะฝะธะต_YYYYMMDD"(
"ะกะพะพะฑัะตะฝะธะต"
uuid
PRIMARY KEY
, "ะขะตะผะฐ"
uuid
, "ะะฐัะฐะขะตะผั"
date
, "ะะฒัะพั"
uuid
, "ะะฐัะฐะัะตะผั" -- ะธัะฟะพะปัะทัะตะผ ะบะฐะบ ะดะฐัั
timestamp
, "ะขะตะบัั"
text
);
CREATE TABLE "ะะดัะตัะฐั_YYYYMMDD"(
"ะะฐัะฐะกะพะพะฑัะตะฝะธั"
date
, "ะกะพะพะฑัะตะฝะธะต"
uuid
, "ะะตััะพะฝะฐ"
uuid
, PRIMARY KEY("ะกะพะพะฑัะตะฝะธะต", "ะะตััะพะฝะฐ")
);
CREATE TABLE "ะคะฐะนะป_YYYYMMDD"(
"ะะฐัะฐะกะพะพะฑัะตะฝะธั"
date
, "ะคะฐะนะป"
uuid
PRIMARY KEY
, "ะกะพะพะฑัะตะฝะธะต"
uuid
, "BLOB"
uuid
, "ะะผั"
text
);
CREATE TABLE "ะ ะตะตัััะกะพะพะฑัะตะฝะธะน_YYYYMMDD"(
"ะะฐัะฐะกะพะพะฑัะตะฝะธั"
date
, "ะะปะฐะดะตะปะตั"
uuid
, "ะขะธะฟะ ะตะตัััะฐ"
smallint
, "ะะฐัะฐะัะตะผั"
timestamp
, "ะกะพะพะฑัะตะฝะธะต"
uuid
, PRIMARY KEY("ะะปะฐะดะตะปะตั", "ะขะธะฟะ ะตะตัััะฐ", "ะกะพะพะฑัะตะฝะธะต")
);
CREATE INDEX ON "ะ ะตะตัััะกะพะพะฑัะตะฝะธะน_YYYYMMDD"("ะะปะฐะดะตะปะตั", "ะขะธะฟะ ะตะตัััะฐ", "ะะฐัะฐะัะตะผั" DESC);
-- ัะตะบัะธะธ ะฟะพ ะดะฐัะต ัะตะผั
CREATE TABLE "ะขะตะผะฐ_YYYYMMDD"(
"ะะฐัะฐะขะตะผั"
date
, "ะขะตะผะฐ"
uuid
PRIMARY KEY
, "ะะพะบัะผะตะฝั"
uuid
, "ะะฐะทะฒะฐะฝะธะต"
text
);
CREATE TABLE "ะฃัะฐััะฝะธะบะขะตะผั_YYYYMMDD"(
"ะะฐัะฐะขะตะผั"
date
, "ะขะตะผะฐ"
uuid
, "ะะตััะพะฝะฐ"
uuid
, PRIMARY KEY("ะขะตะผะฐ", "ะะตััะพะฝะฐ")
);
CREATE TABLE "ะะฐััะกะพะพะฑัะตะฝะธะนะขะตะผั_YYYYMMDD"(
"ะะฐัะฐะขะตะผั"
date
, "ะขะตะผะฐ"
uuid
PRIMARY KEY
, "ะะฐัะฐ"
date
);
ํ ํผ์ด๋ผ๋ ์๋ผ๋ค
๊ทธ๋ผ, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ํ๋ ๊ฐ์ ๋ถํฌ(ํธ๋ฆฌ๊ฑฐ ๋ฐ ์์ ๋๋ PARTITION BY๋ฅผ ํตํด)์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ "์๋์ผ๋ก" ํํฐ์ ํค ๊ฐ์ด ์ด๋ฏธ ํ ์ด๋ธ ์์ฒด์ ์ด๋ฆ์ ์ ์ฅ๋์ด ์์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ๋น์ ์ด ๊ทธ๋ ๋ค๋ฉด ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์ ๋ํด ๋งค์ฐ ์ฐ๋ คํ๊ณ ์์ต๋๋ค๊ทธ๋ฌ๋ฉด ์ด๋ฌํ "์ถ๊ฐ" ํ๋๋ฅผ ์ ๊ฑฐํ๊ณ ํน์ ํ
์ด๋ธ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ ์น์
์ ๋ชจ๋ ์ ํ ์ฌํญ์ ์ ํ๋ฆฌ์ผ์ด์
์ชฝ์ผ๋ก ์ฎ๊ฒจ์ผ ํฉ๋๋ค.
์ถ์ฒ : habr.com
