복붙노트

[SQL] 약한 개체에 대한 데이터베이스 모델링

SQL

약한 개체에 대한 데이터베이스 모델링

내 데이터베이스 주문 및 orderHistory 2 개 테이블을 가지고있다.

 -----------------                    -----------------------
 |  orders       |                    |  orderHistory       |
 -----------------                    -----------------------
 | orderID  (PK) |                    | historyLineID  (PK) |
 | orderDate     |                    | status              |
 | price         |                    | quantity            |
 -----------------                    -----------------------

지금 주문 여러 역사 라인을 가질 수 있습니다. 그러나, 역사 선은 그 자체로 존재할 수 없습니다. 나는이 약한 엔티티라고 때문에 주문에서 PK가 테이블 orderHistory의 PK의 일부 여야합니다 들었다.

질문

노트

주문 ID 및 historyLineID 모두 대리 키입니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.엔터티는 독립적으로 존재할 수 있기 때문에 약한 아니지만 독립적으로 식별 할 수 있기 때문이다. 따라서, 약한 엔티티 "리드"가 호출되는 관계는 관계가 "확인". 실제로, 부모의 기본 키가 자녀의 PK의 (일반적으로 적당한) 부분 집합으로 마이그레이션되는이 수단 (이것은 이론적으로 어떤 키에 적용 할 수 있지만 용어 "약한 개체는"일반적으로, 기본 키의 관계에 정의되어 있습니다).

    엔터티는 독립적으로 존재할 수 있기 때문에 약한 아니지만 독립적으로 식별 할 수 있기 때문이다. 따라서, 약한 엔티티 "리드"가 호출되는 관계는 관계가 "확인". 실제로, 부모의 기본 키가 자녀의 PK의 (일반적으로 적당한) 부분 집합으로 마이그레이션되는이 수단 (이것은 이론적으로 어떤 키에 적용 할 수 있지만 용어 "약한 개체는"일반적으로, 기본 키의 관계에 정의되어 있습니다).

    독립적으로 존재할 수 없다 엔티티를 완벽하게 합법적이지만, 독립적으로 식별 할 수 있습니다 - 즉, 비 NULL에 식별 할 수없는 관계입니다.

    당신은 물어 봐야 : 혼자 고유 또는 주문 ID와 함께 historyLineID 수 있습니까? 나는 후자가 약한 개체 만들 것입니다 경우, 의심.

    당신이 우리에게 보여준 것은 약한 엔티티 아닌 - 부모의 PK는 자녀의 PK로 마이그레이션되지 않습니다.

    당신은 기본적으로 두 가지 옵션이 있습니다 :

    예, 이것은 위에서 설명한 첫 번째 옵션이다. 당신이 orderHistory 자체에 자식 관계가 없다면, 이것은 또한 가장 좋은 솔루션입니다. orderHistory이 5 월보다 아이를 가지고 또는 여러 요인에 따라 최적의 솔루션이 될하지 않을 수 있습니다.

    이 중 하나 또는하지 않습니다. 상술 한 바와 같이 필드 및 FK (기본 또는 보조)의 주요 부분을 모두 할 수있다.

    당신은 당신이 정확하게 키를 지정하지 않는 3NF에 도달 할 수 없습니다, 당신은 할 수 없습니다 독립적으로 식별 할 수있는 엔티티 고려하지 않고 그렇게 할 수 없습니다.

  2. ==============================

    2.이 옵션 필수 관계처럼 들린다. 당신의 ORDERID가 orderHistory에서 "선택"속성이 그래서 ... 2. 부분적으로 기본 키를 주문 ID 및 historyLineID의 조성물을 제조하여 문제를 해결할 수 3. 당신은 주문 ID 테이블에 involuted 관계를해야 할 것입니다. 그래서 당신은 그렇지 않으면 당신은 아직 존재하지 않는 무언가에 생성 할 수 있으며, order.orderID에 다시 가입 한 다음 새 historyLineID을 만들어야합니다. 4. 이것은되어야 방법입니다. 아마 자신의 스크립트 작업 미래의 사람들이 방법을 이해하는 것이 훨씬 용이합니다. 순서는 여러 주문 라인을 가질 수 있기 때문에, 주문 ID 여러 historyLineID의 (어린이)와 (부모)을 만들 외래 키를 사용하여,이 방법은 아마도 가장 좋은 것입니다.

    이 옵션 필수 관계처럼 들린다. 당신의 ORDERID가 orderHistory에서 "선택"속성이 그래서 ... 2. 부분적으로 기본 키를 주문 ID 및 historyLineID의 조성물을 제조하여 문제를 해결할 수 3. 당신은 주문 ID 테이블에 involuted 관계를해야 할 것입니다. 그래서 당신은 그렇지 않으면 당신은 아직 존재하지 않는 무언가에 생성 할 수 있으며, order.orderID에 다시 가입 한 다음 새 historyLineID을 만들어야합니다. 4. 이것은되어야 방법입니다. 아마 자신의 스크립트 작업 미래의 사람들이 방법을 이해하는 것이 훨씬 용이합니다. 순서는 여러 주문 라인을 가질 수 있기 때문에, 주문 ID 여러 historyLineID의 (어린이)와 (부모)을 만들 외래 키를 사용하여,이 방법은 아마도 가장 좋은 것입니다.

    LINK : 여기 링크 설명을 입력

  3. from https://stackoverflow.com/questions/10656173/database-modeling-for-a-weak-entity by cc-by-sa and MIT license