>

결제를 위해 데이터베이스 테이블을 모델링해야합니다. 여기에는 결제와 결제의 두 필드가 필요하며 아래 표와 같이 하나는 clientA와 clientB 인 두 테이블에 연결해야합니다.

payer_from_id 및 payer_to_id가 clientA 또는 clinetB에 참여할 수 있다는 것을 다이어그램에 어떻게 표시해야합니까?

clientA와 clientB는 두 개의 별도 테이블에 있어야합니다.

  • 답변 # 1

    Yo는 외래 키에서 두 개의 다른 테이블을 참조 할 수 없으므로 시나리오의 관계가 데이터베이스에 정의되지 않습니다. 전혀 작동하지 않게하려면 [payer_from_table] 및 [payer_to_table] 필드를 추가해야합니다. 클라이언트 # 101이 clientA의 "Moe 's Tavern"이지만 clientB의 "Bob 's Burgers"인 경우 소스 테이블을 지정하지 않으면 클라이언트를 구분할 방법이 없습니다.

    또 다른 해결책은 GUID [guid_id] 필드를 두 테이블에 추가하는 것입니다.이 테이블은 테이블이 동일한 데이터베이스에 있다고 가정 할 때 테이블에 관계없이 모든 레코드에 대해 고유 식별자를 만들어야합니다. 여전히 한 번에 두 테이블에 외래 키를 정의 할 수는 없지만 각 테이블에서 [guid_id] 필드를 인덱싱하여 성능을 유지할 수 있습니다. 직접 코딩하지 않으면 계단식 삭제와 같은 항목이 없습니다.

    두 시나리오 모두에서 작동하는 세 번째 옵션은 두 클라이언트 테이블의 데이터로 주기적으로 업데이트되는 세 번째 테이블을 작성하는 것입니다. 공존 할 수 있도록 테이블 ID 또는 GUID가 여전히 필요합니다. 그런 다음 첫 번째 경우에는 복잡한 키를 사용하고 두 번째 경우에는 GUID를 사용하여 외래 키를 조합 된 테이블에 대해 정의 할 수 있습니다.

  • 답변 # 2

    여러 테이블 FOREING KEY 참조를 가질 수 없습니다.

    추천 할 수있는 최선의 방법은 상속 모델을 만드는 것입니다. 이를 위해 일반 CLIENT 테이블을 추가하고 clientA, B, C, D ... 또는 필요한 다른 테이블에 대해 1 : 1 참조를합니다 ....

    그러나, clientA와 B에 반복되는 ID가 없는지 확인해야합니다. Client 테이블에 ClientCategory라는 필드를 사용한 다음 INSERT 전에 트리거를 통해 범주를 확인하고 적절한 테이블에서 ID를 복제 할 수 있습니다.

    모델은 다음과 같아야합니다 :

  • 이전 oracle - sqlplus에서 apex 데이터에 액세스하는 방법은 무엇입니까?
  • 다음 mysql - 먼저 이미지와 이름으로 제품 정렬