2011-02-08 2 views
0

데이터베이스에 테이블이 2 개 있습니다. 표 1 '주문 항목'및 표 2 '주문'입니다. 각 '주문'은 'OrderItems'이 아니어도됩니다. 기본 키를 연결하는 FK 제약 조건을 정의했습니다. OrderId와 OrderItemId는 DeleteRule을 'Cascade'로 설정했습니다. 이렇게하면 주.을 h 제할 때 모든 OrderItem이 h 제됩니다.SQL Server에서 ONE -> MANY 관계 적용

내가 피할 필요가있는 것은 비어있는 주문입니다. 주문이 , 최소, OrderItem이인지 확인해야합니다. 그렇지 않으면 가장 최근에 링크 된 OrderItem이 삭제되는 즉시 자동으로 삭제되어야합니다. 나는 물론 내 애플 리케이션에서 이것을 확인할 수 있지만, 이상적으로 DB는 이것을 처리 할 수있다.

나는 ORM으로 MS SQL Server 2008 및 Entity Framework를 사용하고 있습니다.

감사합니다.

답변

1

이러한 관계는 일반적인 관계형 규칙을 사용하여 집행 할 수 없습니다. 결국 주문을 어떻게 추가 하시겠습니까? 주문이없는 주문 항목을 추가 할 수는 없지만 주문 항목이없는 주문은 할 수 없으면 닭고기 또는 달걀 시나리오로 진행됩니다.

유일한 실제 해결책은 OrderItem 테이블에서 마지막 항목 인 경우 해당 순서를 삭제하는 삭제 트리거를 만드는 것입니다.

+0

삭제 트리거는 삭제시에만 실행되며, @Dave Anderson이 아래에 제안한대로 변경 될 때마다 실행됩니까? – santiagoIT

+0

@santiagoIT : 삽입, 업데이트 및 삭제를 위해 트리거 할 트리거를 정의 할 수 있습니다. –

+0

삭제 된 레코드의 데이터를 얼마나 쉽게 트리거 삭제할 수 있습니까?예를 들어 2 년 이상 된 'OrderItems'을 모두 삭제하면 트리거가 해당 OrderID를 식별 할 수 있습니까? 아니면 0 명의 하위 주문에 대해 모든 주문을 확인해야합니까? –

1

이 양방향 관계는 db 스키마에서 적용 할 수 없습니다. 아마도 비즈니스 논리에서이를 강화해야 할 것입니다.

1

저는 이것을 수행하기위한 제약 기반 방법을 알지 못합니다. OrderItem 테이블에서 "자식이없는"Order 레코드를 삭제하고 삭제하는 트리거를 사용하면 성공할 수 있습니다. 그러나 이것은 "바다를 끓일 것"접근 방식 일 수 있습니다. 시나리오는 비즈니스 로직에서 @rcravens가 권장하는대로.

+0

왜 비즈니스 로직에서이 작업을 수행하는 것이 더 좋을까요? OrderItem이 h 제될 때마다 Order에 다른 OrderItem이 있는지 점검해야합니다. Delete 트리거가 Delete에서만 실행된다고 가정합니다. – santiagoIT

+0

@santiagoIT하지만, 삭제 트리거가 삭제 된 'OrderItem' 레코드의 OrderID를 식별하지 못할 수 있으므로 모든 주문 기록을 스캔하여 남아있는 하위 항목이 있는지 확인해야합니다 (잘못되었지만 내가 트리거를 트리거링 쿼리에서 그런 종류의 정보를 얻을 수있는 방법에 대해 알고). 비즈니스 로직에서이 체크를 수행하면, 영향을받는 OrderID를 보유하고 해당 'Orders'만 삭제할 수 있습니다. –

+1

@santiagoIT 이전 코멘트를 무시 하셔도 좋습니다. @Adam Robinson은 트리거가 어떻게 작동하는지 설명했습니다. –

1

나머지 주문 항목이 있는지 확인한 다음 주문을 보관하려면 UPDATE TRIGGER을 고려하십시오.

이것은 테이블의 행을 변경할 때마다 실행되므로 로직 및 관련 성능을 신중하게 고려해야합니다.