2010-05-16 2 views
0

헐 (Hull)이라는 일반 개체 (테이블)가있는 응용 프로그램이 있습니다. 테이블의 각 선체는 고유합니다.
엔티티 관계 복수 1 : 1의

3 개의 선체가있는 다른 개체가 있지만, 특히 Port_Hull, Center_Hull 및 Starboard_Hull입니다.

일대 다 관계를 만들지 않고 각각에 대해 일대일 관계를 만들려고했지만 헐과 선박을 일대일로 연결하지 않으면 수많은 오류가 발생합니다.). 내가 어떻게 이것에 대해 어떤 생각을하는지, 아니면 개념을 포기하고 혈관 관계를 일대일 관계로 만들어야하고 항상 세 가지 항목이있는 목록을 처리해야합니까?

p.s. 고유 한 식별자를 사용하면 많은 사용자가 연결이 끊긴 상태에서 레코드를 추가 할 수 있습니다.

선체 표

  • HullID의 고유 식별자 (기본 키)
  • 플러스 선체 데이터 필드의 무리

선박 표

  • VesselID의 고유 식별자 (기본 키)
  • MainHullID uniqueidentifier (

답변

0

이 일을 해결할 수

  1. 이 선박의 각 invidivual 선체 필드, 즉 MainHull, PortHull, StarboardHull에 대한 고유 제약 조건을 추가합니다. 이렇게하면 선체는 한 선박에서만 사용할 수 있습니다.
  2. 선박에서 선체 필드를 제거하고 선체에 새 필드를 추가하십시오. 그러면이 선체가 속한 선박의 이름을 명시합니다. 또한 HullType을 Hull에 추가하는 것이 타당한 것처럼 보이므로 어떤 유형의 선체인지 알 수 있습니다. HullType + Vessel에 대한 고유 한 제한 조건은 각 선박이 각 유형의 선체를 최대 1 개 확보한다는 것을 의미합니다. 그러나 불행히도 주어진 유형의 0을 가질 수 있습니다.

나는 첫 번째로 갈 것입니다.선박을 선택하고 연결된 선체를 찾는 것이 더 자연스러워 보일뿐만 아니라 각 선박에 필요한 3 개의 선체가 있는지 확인하십시오. (MainHull, PortHull, StarboardHull에 null이 아닌 제약 조건이 적용됩니다.)

EDIT : 3 개의 선체가 필요없는 선박이라면 두 번째 해법도 고려해 볼 가치가있다. 추가 유형의 선체를 추가해야하는 경우 선체 유형이 참조 된 필드에서 유추되지 않고 제안 된 'HullType'필드에서 명시 적으로 명명되므로 스키마를 변경하지 않고이 작업을 수행합니다.

+0

접근법 하나의 문제 (제 생각 엔)는 모든 선박이 3 개의 선체를 모두 가지고있는 것은 아닙니다 (원래의 게시물을 단순화했습니다).
일부 선박은 단일 선로이며 Mainhull 만 있고 일부 선박은 쌍동선이며 PortHull 및 StarboardHull이 있습니다.
내가 선체 테이블에 대한 기본 키 VesselID 필드와 외장 (M, P & S)에 대한 1 char 필드를 추가해야하는지에 대해 궁금해합니다. VesselID, 그럼 코딩 관계를 다룰 것인가? – Evan

+0

헐 (Hull)에 대한 대리 HullID를 유지하고 싶습니다. 복합 PK를 원하지 않습니다. 대신 VesselID와 M, P, S char 필드에 대해 고유 한 제약 조건을 만듭니다. 즉, 내 대답에 HullType을 사용했습니다. 그런 식으로, 당신은 어떤 종류의 선체라도 하나의 선체를 갖도록 보장합니다. 이제 특정 유형의 선체가 특정 선박에 대해 의미가 있습니다. 다른 질문은 코드에서 간단하게 해결할 수 있습니다 (db 모델에서는 가능하지만 복잡한 경우). 데이터베이스 - 당신은 객체 - 관계 매핑 도구를 사용하여 고려해 봤나? NHibernate? – mdma

+0

LOL - VisualStudio 엔티티 프레임 워크 도구를 사용하려고합니다. 이상한 오류를 줄이고 일렬의 열거자를 인식하지 못하게하려고합니다. 닷넷에 대한 NHibernate는 표준 프레임 워크에 기능을 추가합니까? – Evan

0

은 당신이 당신이 만드는한다고이를 만들 수 있습니다 여부를 여부를 묻는 선박 데이터 필드의

  • 플러스 무리 고유 식별자
  • StarboardHullID 고유 식별자 키와 키가 아닌)
  • PortHullID으로 시도 ?

    첫째, 그것은 가능하다 :

    Create Table Vessel 
    (
        VesselId uniqueidentifier not null primary key 
        , MainHullId uniqueidentifier not null 
        , PortHullId uniqueidentifier not null 
        , StarboardHullId uniqueidentifier not null 
        , ... 
        , Constraint FK_Vessel_Hull_Main 
         Foreign Key (MainHullId) 
         References Hull(HullId) 
        , Constraint FK_Vessel_Hull_Port 
         Foreign Key (PortHullId) 
         References Hull(HullId) 
        , Constraint FK_Vessel_Hull_Startboard 
         Foreign Key (StarboardHullId) 
         References Hull(HullId) 
        , Constraint UC_Vessal_MainHullId Unique (MainHullId) 
        , Constraint UC_Vessal_PortHullId Unique (PortHullId) 
        , Constraint UC_Vessal_StarboardHullId Unique (StarboardHullId) 
    ) 
    

    1 : 당신이 외국 부모 테이블에 키와 외래 키가 고유 할 필요가있는 자식 테이블이있을 때 한 관계가 생성됩니다.

    이제 좋은 디자인인지 여부는 문제 도메인에 따라 달라집니다. 좌, 우 및 중앙을 기준으로 3 개의 다른 선체가있는 선박이있는 것은 이상한 것으로 보이지만 어쩌면 나는 뭔가를 놓치고 있습니다. 1 개의 다른 방법 :

  • +0

    글쎄, 실제로, 두 가지 질문. 두 번째 질문에 대해서. 각 선체마다 다른 구성 요소 (탱크, 엔진 등)를 포함 할 수 있으며 실제 크기가 다를 수 있습니다. 예. 전형적인 Trimaran은 더 큰 센터 선체와 두 개의 더 작은 항구와 우현 선체를 가지고 있습니다. 2 개의 선체가있는 모노 쉘 (monohulls)과 쌍동선 (catamarans) 인 선박도 있기 때문에 실제로 질문을 단순화했습니다. 난 우주선 유형 필드를 기반으로 monohulls, catamarans 및 trimarans에 대해 동일한 데이터베이스 테이블에서 다른 엔티티 개체를 만듭니다. 세 가지 유형의 메소드는 서로 다른 비즈니스 룰을 가정합니다. – Evan