Home > DB > ๐Ÿ’พ[Database] ์Šคํ‚ค๋งˆ(Schema)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ’พ[Database] ์Šคํ‚ค๋งˆ(Schema)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
Database

๐Ÿ’พ[Database] ์Šคํ‚ค๋งˆ(Schema)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

  • ์Šคํ‚ค๋งˆ(Schema)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์šฉ์–ด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๊ณ , ์–ด๋–ป๊ฒŒ ์กฐ์งํ™”๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋…ผ๋ฆฌ์  ์„ค๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด, ํ…Œ์ด๋ธ”, ๋ทฐ, ์ธ๋ฑ์Šค, ํŠธ๋ฆฌ๊ฑฐ, ์ €์žฅ ํ”„๋กœ์‹œ์ €, ์ œ์•ฝ ์กฐ๊ฑด ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด๋“ค์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ ์Šคํ‚ค๋งˆ์˜ ์ฃผ์š” ์š”์†Œ.

1๏ธโƒฃ ํ…Œ์ด๋ธ”(Table).

  • ์Šคํ‚ค๋งˆ(Schema)์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰(Row)๊ณผ ์—ด(Column) ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํ…Œ์ด๋ธ”์€ ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ(์˜ˆ: ์‚ฌ์šฉ์ž, ์ œํ’ˆ ๋“ฑ)๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ํ…Œ์ด๋ธ”์˜ ์—ด(Column)์€ ์†์„ฑ์„, ํ–‰์€ ๊ฐ ๊ฐœ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ปฌ๋Ÿผ(Column).

  • ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์œ ํ˜•(์ •์ˆ˜, ๋ฌธ์ž์—ด ๋“ฑ)๊ณผ ์ œ์•ฝ ์กฐ๊ฑด(์˜ˆ: NOT NULL, UNIQUE)์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)์—์„œ ์ปฌ๋Ÿผ(Column, ์—ด)์˜ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ํฌ๊ธฐ ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ๊ธฐ๋ณธ ํ‚ค(Primary Key)

  • ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ–‰(Row)์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์—ด(๋˜๋Š” ์—ด์˜ ์กฐํ•ฉ)์ž…๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)์—์„œ ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋Š” ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ’์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์™ธ๋ž˜ ํ‚ค(Foreign Key)

  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค(Primary Key)์™€ ์—ฐ๊ฒฐ๋˜๋Š” ์—ด(Column)๋กœ, ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)์—์„œ ์™ธ๋ž˜ ํ‚ค(Foreign Key)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ์ธ๋ฑ์Šค(Index)

  • ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์—ด(Column)์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)์—์„œ ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

6๏ธโƒฃ ๋ทฐ(View)

  • ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ , SQL(Structured Query Language) ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

7๏ธโƒฃ ์ œ์•ฝ ์กฐ๊ฑด(Constraints)

  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์ด๋‚˜ ์—ด(Column)์— ์ ์šฉ๋˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, NOT NULL, UNIQUE, CHECK, FOREIGN KEY ๋“ฑ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์Šคํ‚ค๋งˆ์— ์ •์˜๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์Šคํ‚ค๋งˆ์˜ ์ข…๋ฅ˜.

1๏ธโƒฃ ๋…ผ๋ฆฌ์  ์Šคํ‚ค๋งˆ(Logical Schema)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ „์ฒด์ ์ธ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ํ…Œ์ด๋ธ”, ๋ทฐ, ์ธ๋ฑ์Šค ๋“ฑ์˜ ๋…ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณผ์ง€๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ฌผ๋ฆฌ์  ์Šคํ‚ค๋งˆ(Physical Schema)

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ด๋Š” ํ•˜๋“œ์›จ์–ด ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ, ์ธ๋ฑ์Šค ํŒŒ์ผ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์‚ฌ์šฉ์ž ์Šคํ‚ค๋งˆ(User Schema)

  • ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ, ํŠน์ • ๋ทฐ๋‚˜ ํ…Œ์ด๋ธ”๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์Šคํ‚ค๋งˆ ์˜ˆ์‹œ.

  • ์Šคํ‚ค๋งˆ๋Š” SQL์„ ํ†ตํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
CREATE TABLE Users (
    user_id INT PRIMARY KEY, -- ๊ธฐ๋ณธ ํ‚ค
    username VARCHAR(50) NOT NULL -- NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
    email VARCHAR(100) UNIQUE, -- ๊ณ ์œ ํ•œ ๊ฐ’
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
  • ์œ„ ์Šคํ‚ค๋งˆ ์ •์˜์—์„œ๋Š” User ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • user_id: ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋กœ, ๊ณ ์œ ํ•œ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.
    • username: ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๋ฉฐ, NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • email: ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ์„ ์ €์žฅํ•˜๋ฉฐ, ๊ณ ์œ ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • created_at: ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์Šคํ‚ค๋งˆ์˜ ์—ญํ• .

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •์˜
    • ์Šคํ‚ค๋งˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋Š” ํ…Œ์ด๋ธ”, ์—ด(Column), ์ œ์•ฝ ์กฐ๊ฑด ๋“ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€
    • ์Šคํ‚ค๋งˆ๋Š” ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๊ทœ์น™์„ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์™ธ๋ž˜ ํ‚ค(Foreign Key) ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ
    • ์Šคํ‚ค๋งˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋‚˜ DBA(Database Administrator)๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ ์š”์•ฝ.

  • ์Šคํ‚ค๋งˆ(Schema)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์˜ ์„ค๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๊ณ  ์กฐ์ง๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ”(Table), ์—ด(Column), ์ธ๋ฑ์Šค(Index), ๋ทฐ(View), ์ œ์•ฝ ์กฐ๊ฑด(Constraints) ๋“ฑ์ด ์Šคํ‚ค๋งˆ์— ํฌํ•จ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ‚ค๋งˆ(Schema)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํšจ์œจ์ ์ธ ์šด์˜๊ณผ ๊ด€๋ฆฌ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.