두 개의 테이블이 있습니다 :
- 사용자
- 주소
사용자는 주소에 대한 참조를 포함합니다.
주소에는 사용자를 나타내는 CreatedBy 및 ModifiedBy 열이 포함됩니다.
주기적 종속성을 피하기 위해이 데이터베이스를 어떻게 설계합니까?
두 개의 테이블이 있습니다 :
사용자는 주소에 대한 참조를 포함합니다.
주소에는 사용자를 나타내는 CreatedBy 및 ModifiedBy 열이 포함됩니다.
주기적 종속성을 피하기 위해이 데이터베이스를 어떻게 설계합니까?
답변:
팁과 요령 (지연된 제약 조건 포함)을 검색하는 대신 이 "참조 잠금"을 벗어나는 방식을 설계 하는 것이 좋습니다. 따라서 다음과 같이 시도하십시오.
사리
(UserID)
가 존재합니다.(AddressID)
가 주소 를 만들었습니다 .(UserID)
(AddressID)
가 Date 에 작성되었습니다 (DateCreated)
.(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
논리
필수 주소에 관한 한 응용 프로그램 계층에서로드 명령문을 트랜잭션으로 래핑하십시오. 그러면 모든 것을 얻거나 얻지 못하게됩니다.
첫 번째 테이블을 만들 때 하나의 테이블이 없기 때문에 다음과 같이 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를 구현할 수도 있습니다.