데이터베이스 식별 관계, 비식별 관계

데이터베이스 식별 관계, 비식별 관계에 대해서 공부한 내용을 정리해보았습니다.

데이터베이스 식별 관계, 비식별 관계 개념

식별 관계
자식 엔터티가 부모 엔터티의 기본키를 포함하는 강한 결합 관계로, 데이터 무결성을 유지하는 데 유리하지만 기본키와 조인 연산이 복잡해질 수 있습니다.

비식별 관계
자식 엔터티의 기본키가 독립적인 약한 결합 관계로, 데이터 모델의 유연성과 조인 연산의 단순성을 제공하지만 데이터 무결성을 유지하기 위한 추가적인 관리가 필요합니다


특성식별 관계 (Identifying Relationship)비식별 관계 (Non-Identifying Relationship)
기본키 포함 여부자식 엔터티의 기본키가 부모 엔터티의 기본키를 포함함자식 엔터티의 기본키가 부모 엔터티의 기본키를 포함하지 않음
관계 강도강한 결합, 부모 엔터티에 강하게 의존약한 결합, 부모 엔터티에 덜 의존
ERD 표기실선으로 표시점선으로 표시
기본키 구성복잡한 기본키 (부모 + 자식)단순한 기본키 (자식만)
데이터 무결성부모 엔터티 삭제 시 자식 엔터티도 삭제 가능부모 엔터티 삭제 시 자식 엔터티 관리 필요
예시OrderOrderItem (OrderItem 기본키에 Order 기본키 포함)CustomerOrder (Order 기본키는 독립적)
유연성데이터 모델의 유연성이 떨어짐데이터 모델의 유연성이 높음
관리 복잡성기본키 관리가 복잡함기본키 관리가 쉬움
조인 연산조인 연산이 복잡할 수 있음조인 연산이 단순함

데이터베이스 식별 관계, 비식별 관계 장단점

식별 관계

장점:
– 데이터 무결성 유지가 용이합니다.
– 엔터티 간의 강한 종속성을 명확히 표현할 수 있습니다.


단점:
– 자식 엔터티의 기본키가 복잡해질 수 있습니다.
– 쿼리 작성 시 조인 연산이 복잡해질 수 있습니다.
– 데이터 모델의 유연성이 떨어질 수 있습니다.

비식별 관계

장점:
– 자식 엔터티의 기본키가 단순하여 관리하기 쉽습니다.
– 데이터 모델의 유연성이 높아집니다.
– 쿼리 작성 시 조인 연산이 간단해집니다.


단점:
– 데이터 무결성을 유지하기 위한 추가적인 관리가 필요합니다.
– 엔터티 간의 종속성을 명확히 표현하기 어려울 수 있습니다.

장고에서 식별관계와 비식별 관계 정의

식별 관계

식별 관계는 자식 모델의 기본키(Primary Key)가 부모 모델의 기본키를 포함하는 경우입니다.

이를 구현하기 위해 Django에서는 일반적으로 OneToOneField를 사용하여 부모 모델의 기본키를 자식 모델의 기본키로 설정합니다

from django.db import models

class Order(models.Model):
    order_id = models.AutoField(primary_key=True)
    order_date = models.DateTimeField()

class OrderItem(models.Model):
    order = models.OneToOneField(Order, on_delete=models.CASCADE, primary_key=True)
    item_id = models.AutoField(primary_key=True)
    quantity = models.IntegerField()

비식별 관계

비식별 관계는 자식 모델의 기본키가 부모 모델의 기본키를 포함하지 않는 경우입니다. 일반적으로 ForeignKey를 사용하여 자식 모델에 부모 모델의 기본키를 외래키로 설정합니다.

from django.db import models

class Customer(models.Model):
    customer_id = models.AutoField(primary_key=True)
    customer_name = models.CharField(max_length=100)

class Order(models.Model):
    order_id = models.AutoField(primary_key=True)
    order_date = models.DateTimeField()
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

# 여기서 Order의 기본키는 customer_id를 포함하지 않습니다.
# customer는 ForeignKey로 설정되며, order_id는 Order 모델의 기본키로 독립적으로 정의됩니다.

참고하면 좋은 글

9: Integrity Rules and Constraints – Business LibreTexts

Leave a Comment

목차