주기적 종속성을 피하기 위해이 데이터베이스를 설계하는 방법은 무엇입니까?


12

두 개의 테이블이 있습니다 :

  1. 사용자
  2. 주소

사용자는 주소에 대한 참조를 포함합니다.

주소에는 사용자를 나타내는 CreatedBy 및 ModifiedBy 열이 포함됩니다.

주기적 종속성을 피하기 위해이 데이터베이스를 어떻게 설계합니까?


4
ModifiedBy가 응용 프로그램 사용자 (User 테이블에 있음)가 아니라 변경 한 데이터베이스 사용자에 대한 참조가 아닙니까? 어느 쪽이든, 그것은 정말로 중요하지 않습니다. 왜 실제 문제가 있는지 모르겠습니다.
— Philᵀᴹ

어느 것이 먼저 생성 될까요? ANdBy ANd Modifiedby는 필수 데이터입니다. 그리고 사용자 테이블의 addressid는 null이 아니어야합니다. Chicken-egg problem. userid 및 addressid에 대한 참조를 포함하는 새 테이블 UserAddress를 작성하여이 문제를 해결하면
— Shashi

2
DBMS가 지원하는 경우 항상 지연된 제한 조건을 사용할 수 있습니다.
— Colin 't Hart

NB 관계형 모델은 하나의 원자 연산으로 두 개의 삽입 또는 업데이트를 지원하지만 SQL에서 지원하지 않는 것은 부끄러운 일입니다.
— Colin 't Hart

답변:


7

팁과 요령 (지연된 제약 조건 포함)을 검색하는 대신 이 "참조 잠금"을 벗어나는 방식을 설계 하는 것이 좋습니다. 따라서 다음과 같이 시도하십시오.


사리

  • 사용자(UserID) 가 존재합니다.
  • 사용자(AddressID) 가 주소 를 만들었습니다 .(UserID)
  • 주소(AddressID) 가 Date 에 작성되었습니다 (DateCreated).
  • 사용자 가 Date 에 주소(AddressID) 를 마지막으로 수정했습니다 .(UserID)(ModifiedOn)
  • 사용자(UserID) 는 Date 이후 주소에 있습니다 .(AddressID)(ValidFrom)

제약

  • Each exactly one 사용자 가 주소 를 만들었습니다 . 사용자 가 It is possible that more than one 주소 를 만들었습니다 .the same

  • Each 주소 가 exactly one Date 에 작성되었습니다 . It is possible that more than one 주소 가 the same Date 에 작성되었습니다 .

  • For each 주소 and 날짜 , that 주소는 에 의해 수정 된 at most one 사용자 에 that 날짜 .

  • For each 사용자 and 날짜 , that 사용자 는 날짜 이후의 at most one 주소 입니다.that


논리

여기에 이미지 설명을 입력하십시오


필수 주소에 관한 한 응용 프로그램 계층에서로드 명령문을 트랜잭션으로 래핑하십시오. 그러면 모든 것을 얻거나 얻지 못하게됩니다.


5

첫 번째 테이블을 만들 때 하나의 테이블이 없기 때문에 다음과 같이 2 가지 작업에서 순환 종속성을 만들 수 있습니다.

CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));

ALTER TABLE A ADD B_FK INT;

순환 종속성을 피하려면 그런 다음 하나의 REFERENCES 제한 조건을 제거하거나 한 가지 방법으로 DELETE 및 UPDATE CASCADE 참조를 추가 할 수 있습니다. 논리가 다소 복잡한 경우 TRIGGER를 구현할 수도 있습니다.


1
구속 조건을 제거하면 정의에서 순환 종속성이 제거되지만 디자인에서는 제거되지 않습니다. 이벤트 테이블을 추가하여 마지막으로 주소를 만들거나 수정 한 UserID 및 AddressID를 기록 할 수 있지만 종속성은 한 단계 더 멀리 이동합니다. 다른 방법으로, User 테이블에 CreatedBy 및 ModifiedBy 열이 있으면 순환 종속성이 한 테이블에 존재합니다. 이는 감독자가 직원 인 감독자 열이있는 직원 테이블과 유사합니다. Phil이 지적했듯이-문제는 없습니다.
— 레이 리펠

@LeighRiffel 동의합니다. 그러나 제안한 Events 테이블은 실제로 모든 주기적 종속성을 제거합니다.
— ypercubeᵀᴹ

@ypercube 실제로 그렇습니다. 내가 그 선을 어떻게 넘 었는지 모르겠다. 순환 종속성을 제거하더라도 이벤트 테이블을 작성해서는 안됩니다.
— 레이 리펠

어쨌든, 나는이 대답이 문제를 해결한다고 생각하지 않습니다. 문제는 순환 경로를 피하는 방법에 관한 것이지, 처음에는 순환 경로를 사용하여 FK를 만드는 방법이 아닙니다.
— ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.