1. 정규화 설계 적용을 통한 데이터 중복 개선과 무결성 유지
1정규화(1NF)
각 칼럼이 원자값을 가져야한다. 즉 칼럼에 리스트나 중첩된 JSON등을 저장해서는 안된다.
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
emails=["x.com", "y.com"] 같은 저장은 1정규화를 만족하지 않는다.
2정규화(2NF)
1NF를 만족하면서 부분적 함수종속을 제거해야한다. 즉, pk의 일부만 가지고 결정되는 속성이 있다면 그걸 별도의 테이블로 분리해야한다.
class StudentCourse(models.Model):
student = models.ForeignKey(User, on_delete=models.CASCADE)
course_id = models.CharField(max_length=10)
course_name = models.CharField(max_length=100)
instructor = models.CharField(max_length=100)
위 예시에서는 course_id만으로 course_name과 instructor를 결정할 수 있다. 즉 2NF가 위반된다.
코스에 대한 테이블과 학생의 대한 테이블을 분리하면 부분적 종속성을 제거할 수 있다.
분리이후:
class Course(models.Model):
course_id = models.CharField(max_length=10, unique=True)
name = models.CharField(max_length=100)
instructor = models.CharField(max_length=100)
class StudentCourse(models.Model):
student = models.ForeignKey(User, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
3정규화(3NF)
2NF를 만족하지만 이행적 종속이 발생하는 경우.
예를들어 student_id(pk) -> department_name -> department_office 처럼 department_office는 pk가 아니라 department_name에 의해 결정된다.
class Student(models.Model):
student_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
department_name = models.CharField(max_length=100)
department_office = models.CharField(max_length=100)
3NF 만족을 위해서는 department를 분리해야한다.
class Department(models.Model):
name = models.CharField(max_length=100, unique=True)
office = models.CharField(max_length=100)
class Student(models.Model):
student_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
이제 모든 속성이 pk를 직접 의존한다.
2. 3NF이상의 정규화
BCNF, 4NF, 5NF등이 있다.
- BCNF: Candidate Key가 아닌 속성이 결정자가 되는 경우 제거
- 4NF: 다치 종속(MVD) 제거
- 5NF: 조인 종속 제거
4NF까지는 필요에 의해 사용한 적이 있지만, 과도한 정규화는 성능저하를 발생시킨다.
테이블이 많아지니 JOIN연산이 증가하고, 데이터 조회량이 많아질때 다중 테이블을 조인해야하면 성능이 급격히 떨어진다.
'웹 프로그래밍 > DRF' 카테고리의 다른 글
효율적인 Django 사용을 위한 몇가지 (분산트랜잭션 처리와 ACID) (0) | 2025.02.26 |
---|---|
효율적인 Django 사용을 위한 몇가지(쿼리 최적화 적용편) (0) | 2025.02.26 |