2010-08-03 2 views
0

테이블의 다른 값에 따라 다른 많은 테이블 중 하나에 테이블의 레코드를 연결하는 소프트 외래 키가있는 상황이 있습니다. 보여주기 :SQL 디자인 조언 : 하나의 FK 열, 참조 할 많은 테이블

TableOfTables : 아이디, TABLENAME

HistoryTable : 아이디, TableOfTableId, NumberedTableId, 등등 ...

표 : 아이디, 등 ...

표 2 : 아이디 등 ..

표 3 : 이드 등 ..

TableOfTables 데이터베이스 (표 1, 표 2, 표 3, ...)의 각 번호 테이블의 레코드를 포함한다. HistoryTable에는이 테이블 (TableOfTableId)에 대한 외래 키가 있습니다. 또한 번호가 매겨진 테이블의 Id 열에 대한 참조 인 열 NumberedTableId가 있습니다.

이제는 정상적으로 작동하지만 NumberedTableId와 번호가 매겨진 테이블의 Id 열 간에는 참조 무결성이 없습니다. 지금까지 내가 아는 한 어떤 조건에 따라 다른 테이블을 가리킬 수있는 일종의 조건부 외래 키를 작성할 수 없습니다 ... 그래서 여기서 참조 무결성을 얻는 가장 좋은 방법은 무엇입니까?

내가 생각할 수있는 유일한 두 가지는 nullable로 채워진 열의 나머지가있는 특정 번호가 매겨진 테이블에 외래 키가있는 HistoryTable에 nullable NumberedTableId 열을 많이 가지고있는 것입니다. ugly 또는 각 번호가 매겨진 테이블에 대해 별도의 HistoryTable을 보유하고 있습니다 ... 이것은 데이터베이스에 번호가 매겨진 많은 테이블이 있기 때문에 많은 HistoryTables를 의미합니다.

내 최고의 옵션은 무엇입니까? 히스토리 테이블은 실제로 변경 사항을 기록하고 번호가 매겨진 테이블의 값을 변경하는 로깅 테이블입니다.이 프로그램은 감사 이외의 용도로는 사용되지 않으며 프로그램에서 전혀 읽지 않지만 전체 참조 무결성이 필요하지 않습니다.

내 옵션에는 어떤 것들이 있습니까? 모든 솔루션은 Entity Framework 4.0에서 작동 할 수 있어야합니다.

감사

사실
+0

정답은 해결책을 재구성하는 것입니다. 여러 테이블을 참조하는 테이블 하나를 사용하는이 접근법은 방대한 SQL 코드의 냄새입니다. –

답변

1

, 세 가지 옵션이 주어진 행 만이 할 수있는 집행 점검 제한 조건과

  1. 여러 FK 컬럼 (당신이 언급 한하지만 난 여기를 재 작성합니다)가 있습니다 단일 FK 값.
  2. 다중 히스토리 테이블
  3. 참조 무결성 (소스 테이블 및 히스토리 테이블에 대한 트리거)을 실행하는 지옥의 트리거가있는 단일 히스토리 테이블.

깨끗한 답변은 없습니다. 이 문제에 대한 나의 접근 방식은 외래 키 및 계단식 업데이트 및 삭제를 사용하여 현재 데이터의 각 테이블에 대한 내역 테이블을 갖는 것입니다. 적어도 하나의 테이블에서 병목 현상을 피하고 참조 무결성을 허용하며 다른 개발자에게 분명합니다.