웹 프로그래밍/DRF

효율적인 Django 사용을 위한 몇가지(정규화 설계 적용편)

728x90
반응형

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연산이 증가하고, 데이터 조회량이 많아질때 다중 테이블을 조인해야하면 성능이 급격히 떨어진다. 

728x90
반응형