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


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.