데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장하는 것)을 위해 엔터티를 작은 단위로 분리하는 과정이다. 정규화를 할 경우 데이터 조회 성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다.
하지만 그렇다고 무작정 정규화를 통해 엔터티를 분리해서는 안 된다. 엔터티를 분리하기 위한 조건이 따로 존재한다.
![학생 엔터티 (정규화 전 원본 테이블)](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F0e186e17-3108-43bb-ac6b-07ecf89ac768%252FUntitled.png%3Ftable%3Dblock%26id%3D07981ec9-e696-4f3b-9e30-44e9cee1df92%26cache%3Dv2&w=750&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
✅ 1. 제 1 정규형
모든 속성은 반드시 하나의 값만 가져야 한다.
- 제 1 정규화: 속성값이 하나가 되도록 엔터티를 분리하는 것.
![학생 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F0618de7c-71c4-42c3-9cf0-7301fd416a44%252FUntitled.png%3Ftable%3Dblock%26id%3Da78b2731-844c-4c16-8661-927bb01c59b5%26cache%3Dv2&w=750&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
이뿐만 아니라, 유사한 내용의 속성이 여러 개 있더라도 1차 정규화 대상이다.
예를 들면, 특정 학생의 블로그 사이트가 여러 개라면,
blog1
, blog2
, blog3
, … 와 같이 속성을 여러 개 지정할 수 있는데, 이를 분리하는 것도 1차 정규화에 해당한다.✅ 2. 제 2 정규형
엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
주식별자가 단일식별자가 아닌 복합식별자인 경우, 일반속성이 주식별자의 일부에만 종속될 수 있다. 이런 경우 제 2 정규화를 통해 엔터티를 분리해야 한다.
- 제 2 정규화: 일반 속성이 주식별자 모두에 종속되도록 엔터티를 분리하는 것.
여기서는
학생이름
과 수강과목
이 주식별자(복합)인데, 나이
는 학생이름
에만 종속되어 있으므로 아래와 같이 분리해야 한다.![학생 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F7cce73fc-5557-428c-8c3a-71f00f80a02d%252FUntitled.png%3Ftable%3Dblock%26id%3Da8486cb8-8894-48f1-b67e-c99e6feb596d%26cache%3Dv2&w=750&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
![수강과목 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F7095dae3-3ffc-4965-8103-c90d26d2edb5%252FUntitled.png%3Ftable%3Dblock%26id%3Deb63e071-b45b-433a-8b17-45f7f4fc30b3%26cache%3Dv2&w=750&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
✅ 3. 제 3 정규형
주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
아래 테이블을 보면, 할인율은 등급에 의해 결정되고 등급은 고객번호에 의해 결정된다. 여기서 주식별자는 고객번호이므로, 할인율은 등급에 의해 결정되면 안 된다.
![고객 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F07804ffc-602d-483f-a704-9c49d6873272%252FUntitled.png%3Ftable%3Dblock%26id%3Db482f746-e7fc-4ea9-9b0a-fed9ac26d672%26cache%3Dv2&w=1080&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
따라서, 다음과 같이 엔터티를 분리해야 한다.
- 제 3 정규화: 주식별자가 아닌 모든 속성 간 종속성이 없도록 엔터티를 분리하는 것.
![고객 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F5e4932a7-330e-43dc-a5d5-0f067cbadb59%252FUntitled.png%3Ftable%3Dblock%26id%3Dbfa3f541-226f-447d-a507-a959977cb1dc%26cache%3Dv2&w=1080&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
![등급 엔터티](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F05eb58fd-3107-48db-84d5-75b4685f9459%252FUntitled.png%3Ftable%3Dblock%26id%3D7ebb67d3-efec-48c4-b9e6-23745d6f7843%26cache%3Dv2&w=640&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
이렇게 분리하면 각 고객은 등급이 주어지고, 각 등급마다 할인율이 따로 저장되어 있게 된다.
✅ 4. 주의사항
적절한 정규화는 성능에 유리하지만, 지나친 정규화는 오히려 성능 저하를 야기한다. 너무 과도한 정규화는 데이터 조회 시 테이블 간 조인으로 인해 성능이 악화될 수 있다.
Share article