๋ฉ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฒ์๋ถํฐ ์ค๊ณํ๋ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ.
- 1๋ถ: ๋ฒ ์ด์ค ํ๋ ์ ์ค๊ณ
2๋ถ: "์ด์ต์ ์ํ" ๊ตฌ๋ถ
์ฐ๋ฆฌ์ ๊ธฐ๋ฐ์ ๊ทธ๋ ๊ฒ ํฌ์ง๋ ๋ถ์ฐ๋์ง๋ ์์ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ค๋ฉ, ๋ณต์ ๋ฐ ์ง๋ฆฌ์ ๋ถ์ฐ ์์คํ
๋ฌธ์ ๋ ๋ค๋ฃจ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ํ๋ก ์๋ฃจ์
์ ์ค์ ์ ๋ ๊ฒ์
๋๋ค.
1๋จ๊ณ: ์ผ๋ถ ๋น์ฆ๋์ค ์ธ๋ถ์ฌํญ
์ฐ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ์ถ์์ ์ผ๋ก ๋์์ธํ์ง ์๊ณ ํ๊ฒฝ์ ํตํฉํ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฆ๋์ค์ ์๋ฌด๋ ๋ฌด์์ ๋๊น?.. ๊ฐ๋ฐ ๋ถ์์ฅ์ธ Vasily์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- "Nikolai, ์ด ์์
์ ์ํด์๋ ์ค๋ ํจ์น๊ฐ ํ์ํฉ๋๋ค!"
์ด๋ ์์ ์ด ์ผ๋ถ ์ํฉ์์ ์ํ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฌธ์. - โ์ฝ์ผ, ์ค๋ ์ ๋
์ ๋ํ์ ๊ฐ ๊ฑฐ์ผ?โ
์ฆ, ํ ์์ ๋ํ ์๋๋ผ๋ ๋์์ ์์ฌ์ํต์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค์ํ ์ฃผ์ ์. - โํผํฐ, ๋์ฝ๋ผ์ด, ์ฒจ๋ถ ํ์ผ์์ ์ ์๋ฒ ๊ฐ๊ฒฉํ๋ฅผ ์ฐพ์๋ณด์ธ์.โ
๋ฐ๋ผ์ ํ๋์ ๋ฉ์์ง์๋ ์ฌ๋ฌ ์์ ์. ์ด ๊ฒฝ์ฐ ๋ฉ์์ง์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์ฒจ๋ถ ํ์ผ. - โ์ธ๋ฉด์, ๋๋ ์ข ๋ด๋ด.โ
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์์ ์ ์์ฑํ ๊ธฐํ๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ ํ์์ ์ด๋ํ๋ค.
์ง๊ธ์ "๋ช ๋ฐฑํ" ์๊ตฌ ์ฌํญ ๋ชฉ๋ก์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ ์ ์ ์ฉ ์ธ๋ถ ์ฌํญ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ์ ํ ์ฌํญ์ ์ดํดํ์ง ๋ชปํ ์ฑ ๋์์ธ ์ ํจํ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
2๋จ๊ณ: ์ต์ ๋ ผ๋ฆฌ ํ๋ก
์ง๊ธ๊น์ง๋ ๋ชจ๋ ๊ฒ์ด ์ ํต์ ์ธ ๋น์ฆ๋์ค ๋๊ตฌ์ธ ์ด๋ฉ์ผ ์์ ๊ณผ ๋งค์ฐ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค. ์, "์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ก" ๋ง์ ๋น์ฆ๋์ค ๋ฌธ์ ๋ ์๋ก ์ ์ฌํ๋ฏ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ตฌ๋ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์ฌํฉ๋๋ค.
์ด๋ฏธ ์ป์ ์ํฐํฐ ๊ด๊ณ์ ๋
ผ๋ฆฌ ๋ค์ด์ด๊ทธ๋จ์ ์์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ธ์ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๊ฐ์ฅ ์์์ ์ธ ํ์ ์ต์
์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
์ด ์์์ ํ์ผ์ ์ฌ๋, ๋ฌธ์ ๋ฐ ๋ฐ์ด๋๋ฆฌ "๋ณธ๋ฌธ"์ ์๋น์ค ์์ด ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ "์ธ๋ถ" ์ํฐํฐ์
๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ฏธ๋์ ์ด๋ฅผ UUID์ "์ด๋๊ฐ" ๋งํฌ๋ก ์ธ์ํ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๋ค ๊ฐ๋ฅํ ํ ๊ฐ๋จํ ๋ค์ด์ด๊ทธ๋จ - ๋น์ ์ด ๋ณด์ฌ์ค ์ฌ๋๋ค์ ๋๋ถ๋ถ์ UML/IDEF ์ฝ๊ธฐ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค. ํ์ง๋ง ๊ผญ ๊ทธ๋ ค๋ณด์ธ์.
3๋จ๊ณ: ํ ์ด๋ธ ๊ตฌ์กฐ ์ค์ผ์น
ํ
์ด๋ธ ๋ฐ ํ๋ ์ด๋ฆ ์ ๋ณดํ๋์ ํ
์ด๋ธ์ "๋ฌ์์์ด" ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ์ทจ๊ธ๋ ์ ์์ง๋ง ์ด๋ ์ทจํฅ์ ๋ฌธ์ ์
๋๋ค. ์๋ํ๋ฉด
๋ง์ ์ฌ๋๋ค์ด ๋์์ ์ฐ๋ฆฌ์๊ฒ ๋ฉ์์ง๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค ์ค ์ผ๋ถ๋ ์ด๋ฐ ์ผ์ ํ ์๋ ์์ต๋๋ค. ์คํ๋ผ์ธ, ๊ฐ์ฅ ๊ฐ๋จํ ์ต์
์ UUID๋ฅผ ์๋ณ์๋ก ์ฌ์ฉ ์ธ๋ถ ์ํฐํฐ๋ฟ๋ง ์๋๋ผ ์๋น์ค ๋ด๋ถ์ ๋ชจ๋ ๊ฐ์ฒด์๋ ์ ์ฉ๋ฉ๋๋ค. ๋ํ ํด๋ผ์ด์ธํธ ์ธก์์๋ ์์ฑ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ ๋ ๋ฉ์์ง ์ ์ก์ ์ง์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด์ ํ
์ด๋ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ
์ด๋ธ : RU
CREATE TABLE "ะขะตะผะฐ"(
"ะขะตะผะฐ"
uuid
PRIMARY KEY
, "ะะพะบัะผะตะฝั"
uuid
, "ะะฐะทะฒะฐะฝะธะต"
text
);
CREATE TABLE "ะกะพะพะฑัะตะฝะธะต"(
"ะกะพะพะฑัะตะฝะธะต"
uuid
PRIMARY KEY
, "ะขะตะผะฐ"
uuid
, "ะะฒัะพั"
uuid
, "ะะฐัะฐะัะตะผั"
timestamp
, "ะขะตะบัั"
text
);
CREATE TABLE "ะะดัะตัะฐั"(
"ะกะพะพะฑัะตะฝะธะต"
uuid
, "ะะตััะพะฝะฐ"
uuid
, PRIMARY KEY("ะกะพะพะฑัะตะฝะธะต", "ะะตััะพะฝะฐ")
);
CREATE TABLE "ะคะฐะนะป"(
"ะคะฐะนะป"
uuid
PRIMARY KEY
, "ะกะพะพะฑัะตะฝะธะต"
uuid
, "BLOB"
uuid
, "ะะผั"
text
);
ํ ์ด๋ธ: KO
CREATE TABLE theme(
theme
uuid
PRIMARY KEY
, document
uuid
, title
text
);
CREATE TABLE message(
message
uuid
PRIMARY KEY
, theme
uuid
, author
uuid
, dt
timestamp
, body
text
);
CREATE TABLE message_addressee(
message
uuid
, person
uuid
, PRIMARY KEY(message, person)
);
CREATE TABLE message_file(
file
uuid
PRIMARY KEY
, message
uuid
, content
uuid
, filename
text
);
ํ์์ ์ค๋ช ํ ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ฐ๊ฒฐ ๊ทธ๋ํ๋ฅผ "ํ๊ธฐ" ์์ํ๋ ๊ฒ์ ๋๋ค. ์ฐธ์กฐ๋์ง ์์ ํ ์ด๋ธ์์ ๋๊ตฌ์๊ฒ๋ ์์ ์.
4๋จ๊ณ: ๋ช ํํ์ง ์์ ์๊ตฌ์ฌํญ ํ์
๊ทธ๊ฒ ๋ค์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์๋ฒฝํ๊ฒ ๊ธ์ ์ธ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๊ณํ์ต๋๋ค. ์ด๋ป๊ฒ ๋ ์ฝ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ ์๋น์ค ์ฌ์ฉ์์ ์ ์ฅ์์ ์๊ฐํด ๋ด ์๋ค. ์ฐ๋ฆฌ๋ ์ด ์๋น์ค๋ก ๋ฌด์์ ํ๊ณ ์ถ์ต๋๊น?
- ์ต๊ทผ ๊ฒ์๋ฌผ
๊ทธ๊ฒ ์๊ฐ์์ผ๋ก ์ ๋ ฌ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ฅธ "๋์" ๋ฉ์์ง ๋ฑ๋ก. ๋ด๊ฐ ์์ ์ ์ค ํ ๋ช ์ธ ๊ณณ, ๋ด๊ฐ ์ ์์ธ ๊ณณ, ๊ทธ๋ค์ด ๋์๊ฒ ํธ์ง๋ฅผ ์ผ์ง๋ง ๋ด๊ฐ ๋๋ตํ์ง ์์ ๊ณณ, ๊ทธ๋ค์ด ๋์๊ฒ ๋๋ตํ์ง ์์ ๊ณณ, ... - ์์ ์ฐธ๊ฐ์
์ด ๊ธธ๊ณ ๊ธด ๋ํ์ ๋๊ฐ ์ฐธ์ฌํ๊ณ ์๋ ๊ฑธ๊น์?
์ฐ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ํตํด ์ด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ "์ผ๋ฐ์ ์ผ๋ก" ํด๊ฒฐํ ์ ์์ง๋ง ์ ์ํ๊ฒ ํด๊ฒฐํ ์๋ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ฒซ ๋ฒ์งธ ์์ ๋ด์์ ์ ๋ ฌํ๋ ๊ฒ์ ๋๋ค. ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค, ๊ฐ ์ฐธ๊ฐ์์๊ฒ ์ ํฉํ๋ฉฐ (๋ชจ๋ ๊ธฐ๋ก์ ์ถ์ถํด์ผ ํจ) ํ์ํ ๋ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ชจ๋ ๋ฉ์์ง ์ถ์ถ ์ด ์ฃผ์ ์ ๋ํด.
์๋ํ์ง ์์ ์ฌ์ฉ์ ์์ ์ผ๋ก ์ธํด ๊ตต๊ฒ ํ์๋ ์ ์์ ์์ฐ์ฑ์ ๋์ด์๋ค.
5๋จ๊ณ: ์ค๋งํธ ๋น์ ๊ทํ
๋ ๊ฐ์ง ๋ฌธ์ ๋ชจ๋ ์ถ๊ฐ ํ
์ด๋ธ์ ํตํด ํด๊ฒฐ๋ ๊ฒ์
๋๋ค. ๋ฐ์ดํฐ์ ์ผ๋ถ๊ฐ ์ค๋ณต๋จ, ์ฐ๋ฆฌ ์์
์ ์ ํฉํ ์์ธ์ ํ์ฑํ๋ ๋ฐ ํ์ํฉ๋๋ค.
ํ
์ด๋ธ : RU
CREATE TABLE "ะ ะตะตัััะกะพะพะฑัะตะฝะธะน"(
"ะะปะฐะดะตะปะตั"
uuid
, "ะขะธะฟะ ะตะตัััะฐ"
smallint
, "ะะฐัะฐะัะตะผั"
timestamp
, "ะกะพะพะฑัะตะฝะธะต"
uuid
, PRIMARY KEY("ะะปะฐะดะตะปะตั", "ะขะธะฟะ ะตะตัััะฐ", "ะกะพะพะฑัะตะฝะธะต")
);
CREATE INDEX ON "ะ ะตะตัััะกะพะพะฑัะตะฝะธะน"("ะะปะฐะดะตะปะตั", "ะขะธะฟะ ะตะตัััะฐ", "ะะฐัะฐะัะตะผั" DESC);
CREATE TABLE "ะฃัะฐััะฝะธะบะขะตะผั"(
"ะขะตะผะฐ"
uuid
, "ะะตััะพะฝะฐ"
uuid
, PRIMARY KEY("ะขะตะผะฐ", "ะะตััะพะฝะฐ")
);
ํ ์ด๋ธ: KO
CREATE TABLE message_registry(
owner
uuid
, registry
smallint
, dt
timestamp
, message
uuid
, PRIMARY KEY(owner, registry, message)
);
CREATE INDEX ON message_registry(owner, registry, dt DESC);
CREATE TABLE theme_participant(
theme
uuid
, person
uuid
, PRIMARY KEY(theme, person)
);
์ฌ๊ธฐ์๋ ๋ณด์กฐ ํ ์ด๋ธ์ ์์ฑํ ๋ ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ์ต๋๋ค.
- ๋ ์ฝ๋ ๊ณฑํ๊ธฐ
ํ๋์ ์ด๊ธฐ ๋ฉ์์ง ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์ ์(๋ฐ์ ์์ ์์ ์ ๋ชจ๋)์ ๋ํด ๋ค์ํ ์ ํ์ ๋ ์ง์คํฐ์ ์ฌ๋ฌ ํ์ ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ๊ฐ ๋ ์ง์คํฐ๋ ์ธ๋ฑ์ค์ ์ํ๊ฒ ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ์ฒซ ๋ฒ์งธ ํ์ด์ง๋ง ๋ณด๋ ค๊ณ ํฉ๋๋ค. - ๊ณ ์ ํ ๊ธฐ๋ก
ํน์ ์ฃผ์ ์ ๋ํ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋๋ง๋ค ํด๋น ํญ๋ชฉ์ด ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "์ฌ์ "์ ์ถ๊ฐํ์ญ์์ค.
์ด ๊ธฐ์ฌ์ ๋ค์ ๋ถ๋ถ์์ ์ฐ๋ฆฌ๋
์ถ์ฒ : habr.com