![[스프링부트 #10] 데이터베이스 테이블 설계의 철학과 관계 정리](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%252310%255D%2B%25EB%258D%25B0%25EC%259D%25B4%25ED%2584%25B0%25EB%25B2%25A0%25EC%259D%25B4%25EC%258A%25A4%2B%25ED%2585%258C%25EC%259D%25B4%25EB%25B8%2594%2B%25EC%2584%25A4%25EA%25B3%2584%25EC%259D%2598%2B%25EC%25B2%25A0%25ED%2595%2599%25EA%25B3%25BC%2B%25EA%25B4%2580%25EA%25B3%2584%2B%25EC%25A0%2595%25EB%25A6%25AC%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
1. 비즈니스 설계가 먼저다.
“비즈니스를 이해하지 못하고 설계하는 건, 눈 가리고 그림 그리는 것과 같다.”
테이블은 비즈니스의 구조를 데이터로 옮긴 것이다.
화면 UI와 테이블을 따로 보지 말고, 비즈니스 흐름과 UI, 테이블을 함께 연결해서 판단해야 설계가 잘 되었는지 파악 가능하다.
예: 우리는 "싸구려 신발"을 판다
→ 상품 테이블은 필수고, 고객, 주문, 재고 등의 개념이 존재할 것이다.
2. 테이블은 “명사”다 → 명사 설계가 기본
“명사를 먼저 생각하지 않고, 동사를 먼저 설계하면 조진다”
테이블은 기본적으로 명사(Entity) 를 표현한다.
"구매하다", "댓글 달다" 같은 동사는 처음부터 만들지 않는다.
명사들 간의 관계를 설계하다 보면 동사가 필요한 상황이 생기고, 그때 "구매" 같은 동사 테이블이 생긴다.
3. 테이블 간의 관계를 파악하는 핵심 개념
관계는 로우(Row) 기준으로 생각하자!
예시 질문 :
고객 하나는 상품을 몇 개 구매할 수 있을까 ?
- 이것은 "고객 테이블의 한 로우가, 구매 테이블에 몇 개의 로우와 연결되는가"를 묻는 것이다.
- 즉, 항상 하나의 로우에서 출발해서, 상대 테이블의 몇 개의 로우와 관계가 있는가를 생각해야 한다.
4. 관계별 설계 방식 정리

1 : 1 관계
어디에 FK를 둬도 되지만, 관계의 소유자나 접근 빈도에 따라 FK 위치를 결정한다.
예시: 주민등록증 vs 사용자 → 주민등록증이 사용자 테이블 참조
N : 1 관계
N에 FK를 둔다.
N : N 관계
직접 연결하면 원자성이 깨진다. 반드시 중간 테이블이 필요하다.
이 중간 테이블은 동사 테이블이 된다.
고객 ↔ 상품 → "고객이 상품을 구매한다" →
purchase
테이블 (중간테이블)
5. 데이터베이스의 원자성
"컬럼에는 반드시 로우당 하나의 값만 들어가야 한다."
- 하나의 셀에는 리스트처럼 여러 개를 넣으면 안 됨.
- 이를 지키기 위해서는 참조키를 활용해 다른 테이블과 연결해야 함.
- N:1에서 N에 FK를 넣는 이유도 이 원자성 때문이다.
6. 실전 테이블 설계 팁
- 참조키(FK)는 반드시 유일한 키(PK)를 참조해야 한다.
- 수정이 없다면, 중복을 허용하고 조인 없이 데이터를 저장하는 것도 나쁘지 않다.
- 예시: 주문 당시의 고객 이름이나 주소를 별도 테이블 참조 없이 주문 테이블에 직접 저장
- 조인이 필요 없으면 성능상 이점 있음.

7. VIEW = 조인 결과
- 여러 테이블을 조인해서 보여주는 가상의 테이블이 VIEW
- 복잡한 조인 결과를 뷰로 만들어서 재사용하면 쿼리 관리가 편해진다.
8. 게시판 예제: User
↔ Board
관계 설계
- 관계: 1명의 User가 여러 개의 Board 작성 가능 → 1:N
- 따라서 Board 테이블에 user_id(FK) 를 둔다.
- 관계 정의에 맞게 조인도 가능하고, 원자성도 지켜진다.
관계 설계는 결국 "비즈니스 흐름"과 "로우 간의 연결"을 정확히 파악해야 한다.
- 명사 설계를 우선하고, 관계가 복잡해질 때 동사 테이블을 도입
- 무조건 조인을 남용하지 말고, 비즈니스에 따라 중복이 오히려 이득일 수도 있다.
- FK는 어디에 넣을지 원자성을 기준으로 판단
Share article