1

코드를 생성 할 수있는 데이터베이스 모델링 도구로 작업 할 때 거의 지원되지 않는 특정 관계 유형이 있습니다.0 또는 1 대 0 또는 하나의 관계 문제

이들은 1 대 1, 다 대다 및 0 또는 1 대 0 또는 1.1 : 1, : 및 0..1 : 0..1을 포함합니다.

처음 두 개는 쉬운 해결책이 있습니다. 1 또는 1 : 0..1

  1. 1 대 1은 행 1 0..1 또는 1 대 0..1 0..1로 변환함으로써 해결 될 수있다.

    대다 관계는 다음의 중간에있는 테이블을 사용하여 해결 될 수
  2. 중 1 * 및 1 또는 0..1 : 및 * 0 .. 1 또는 이와 유사한 조합. 나는 그것을 해결할 수있는 4 가지 조합이 있다고 생각한다.

그러나 나는 0..1에서 0.1 사이에 붙어 있습니다. 사실, 나는이 논리적 인 관계를 가지고있는 것처럼 보이는 테이블을 가지고 있습니다.

제 경우에는 4 개의 테이블이 있습니다. 논증의 목적으로, 모두 INT 타입의 기본 키를 가지고 있다고 가정합니다. 이 테이블은 People, Organizations, Customers 및 Employees입니다.

로직에 대한 단어입니다. 조직은 People을 가질 수 있으며 관계에서 Contacts라고 불립니다. 사람들은 고객이나 직원 또는 둘 다 될 수 있습니다.

조직 < -> 사람이 연락처로 < -> 있습니다. 이것은 0..1 : * 관계입니다. 즉, 사람은 조직의 유무에 관계없이 존재할 수 있으며 조직에는 많은 사람이 있거나없는 사람이있을 수 있습니다.

직원은 개인 레코드가 있어야하며 그 관계도 의미가 있습니다. 이는 0..1 : 1 관계로, 직원이 Person을 보유해야하지만 Person은 직원 기록이 0 또는 1 일 수 있습니다.

그러나 이것은 상속이 논리적으로 양방향으로 흐르기 때문에 이해가되지 않습니다. 고객에 대한 인물 또는 조직의 경우. 고객은 조직 또는 사람이 될 수 있지만 둘 다일 수는 없으며 선택은 유형 플래그 필드를 통해 이루어집니다. 사람이 반드시 고객 일 필요는 없으며 나중에 직원 또는 다른 연락 유형이 될 수 있습니다. 나는 사람을 고객으로 요구할 수 없으며 나는 고객이 사람이되도록 요구할 수 없다. 마찬가지로 저는 조직이 고객이되도록 요구할 수 없으며 고객이 조직이되도록 요구할 수 없습니다. 그래서 상속의 단절이 필요합니다. 고객 : 사람과 고객 : 조직 모두의 경우에 둘 다 0..1 : 0..1 및 0..1 : 0..1을 구현해야합니다. 그러나 언어 도구는이를 지원하지 않습니다. 강력한 형식의 언어이기 때문에 엔터티 상속은 단일 방향으로 만 흐를 수 있습니다. 약한 유형의 언어로조차도, 닭이나 계란과 같은 상황에서 여전히 바람을 피울 수 있습니다.

JavaScript는 객체 유형의 구조를 동적으로 변경할 수 있기 때문에이 경우에 적합 할 수 있으며이 경우 객체를 명시 적으로 선언 할 수 없더라도 항상 두 순서로 결합 할 수 있습니다. 방법.

그러나 오늘의 도구는 Microsoft LightSwitch이며, 전혀 사용하지 않습니다. 필자는이 관계 유형을 허용 할 강력한 유형의 언어 코드를 생성하고 생성하는 현대 모델링 도구가 존재하지 않는다고 생각합니다.

이 관계를 극복하는 트릭이 있습니까, 0..1 : 0..1, 또는 내가 아직 이해하지 못했던 근본적인 것이 있습니까? 나는 한 쪽을 선택하기 위해 여기에 머물러 있으며, 어느 쪽이 승리하고 있는지 알지 못합니다 : 고객 또는 사람, 고객 또는 조직. 하지만 두 가지 경우 모두를 해치지 않으면 서 내가 할 수있는 일이있을 수 있습니다. 깨진 모델에 대해 뭔가 있습니까?

감사합니다.

답변

0

0..1 모델은 일반적으로 is-a 관계입니다. 이것은 C#의 상속에 매핑됩니다. C#에서는 여러 다른 클래스 (인터페이스를 통해서만)를 상속하는 클래스를 만들 수 없습니다.

모델은 순수하게 관계형 데이터베이스로 모델링되었지만 다중 상속이없는 개체 구조에는 매핑되지 않습니다. 이 경우에는 C#이 제한 요소이므로 C#에서 상속 및 관계를 사용하여 작동하는 모델을 정의한 다음 해당 모델에 대한 Datamodel을 생성합니다.

은 상속 사용할 수 있음을 기억하십시오 : 당신은 사람이나 조직에 직접 Customer 캐스팅 할 수 없습니다이 경우

Customer 
<--is-a- Corporate Customer --has-a-- Organization --has-many-| 
<--is-a- Natural Customer --has-a-- Person <--is-a- Employee 

을,하지만 당신은에 링크 된 레코드를 얻을 수 있습니다 나에게 자연 스럽다고 느끼는이 수업. 그러나 직원은 항상 사람입니다 (의미가 있습니다).

OrganizationPerson은 모두 LegalEntity에서 상속받을 수 있습니다. 어느 쪽이든 당신은 또한이 경우 추가 모델을 단순화 할 수

Customer<T:LegalEntity> -----------has-a--------------- LegalEntity 
^               ^ 
|--is-a- Customer<Organization> (--has-a--) Organization -is-a-| --has-many 
L--is-a- Natural<Person>  (--has-a--) Person -------is-a-|  | 
              ^      | 
               L--is-a- Employee -------| 

그러나합니다 (Natural/Corporate Customer 유지) 위의 모델에서 :

Customer 
    |--has-a LegalEntity <---is-a-- Organization --has-many-| 
         L-is-a-- Person <--is-a- Employee 

아니면 기준으로 사람을 사용할 수 있지만, 그 리드 더 추한 모델 : Employee 또는 Natural Customer (하지만 모두)

Person 
<- Employee ---- Organization <- Corporate Customer 
<- Natural Customer ----|    | 
      |       | 
      L------------------------------->> ICustomer 

하는 경우 귀하의 Person 될 수 있습니다, 당신 플러스 CRE 수 없습니다 인터페이스를 통하는 경우를 제외하고는 Natural CustomerCorporate Customers을 모두 포함하는 Customer의 목록을 읽었지 만 Entity Framework는 항상 그러한 것을 이해하지 못합니다. 이 모델은 어색하지만 현재 모델에 더 가깝게 느껴집니다.

.NET 또는 Entity Framework를 사용하여 원하는 전체 모델을 만들 수 없습니다.

관련 문제