2009-06-24 5 views
3

먼저, 나는 this StackOverflow question을 읽었으므로 그것을 향해 나를 가리킬 필요가 없다.테이블에 관계없는 외래 키?

지금 당장 비슷한 문제가 발생합니다. 특히, db 내의 다른 테이블에 대한 감사 정보를 저장하는 데 사용되는 감사 테이블이있는 데이터베이스가 있습니다. 이 테이블의 기본 형식은 다음과 같습니다

ID가에는 EntityID, EntityTypeID, ActionTypeID 지금 날짜 시간

, 당신은 추측 할 수로서에는 EntityID의 일반적인 성격과이 테이블에서 외래 키 관계에 까다로운 것을 의미 특히 ORM 시스템을 통해 여러분과 함께 관리하십시오.

물론, grunt-work 솔루션은 필요한 쿼리를 수동으로 수행하고 작동하는 ORM 항목을 사용합니다.

그러나이 문제는 테이블의 외래 키 관계를 허용하는 RDBMS가 있는지 여부에 대한 내 의문을 제기합니다. Table : ID가 정의됩니다. '1 TableA의'와 'TableB의 : somekey'

그래서 ...

인가가 즉

는 같은 RDBMS에서 EntityTypeID 열 힘은 가

같은

같은 값을 포함 이 작업을 수행하는 RDBMS는 무엇입니까?

답변

0

db4o과 같은 객체 지향 데이터베이스를 별도의 데이터베이스에 저장하는 옵션을 볼 수 있습니다. 이렇게하면 스토리지 측면에서 추가적인 유연성을 얻을 수 있습니다.

5

감사 테이블은 일반적으로 참조 무결성 제약 조건을 가질 수 없습니다. 감사 테이블 A는 일부 테이블 T에있는 데이터 행 R에 대한 정보를 기록하며 R이 서로 다른 시간에 R을 나타내는 일련의 레코드를 포함합니다. R이 후속 적으로 수정 될 때, A의 정보는 변경되지 않고 R에 대한 변경을 방지 할 수 없다. R이 후속 적으로 삭제되면 A에있는 감사 레코드의 존재는 삭제를 중지 할 수 없다.

+0

당신이 맞습니다 - 감사는 일반적으로 "역사적"을 의미합니다. 따라서 FK를 만들 수 없습니다. –

+0

나는 당신이 그걸로 말하고있는 논리를 본다. 그러나 삭제와 관련하여 귀하의 의견에 동의하지 않습니다. 대부분의 경우, 내가 작업 한 데이터베이스의 전부는 아니지만 실제로는 레코드를 "삭제"하는 것은 레코드를 "삭제"하는 것과 같이 실제로 삭제하지 않고 불리언 값 열을 통해 삭제 된 것으로 표시하는 시스템 내의 여러 테이블간에 많은 관계가 있습니다. 이 접근법은 또한 RDB 데이터를 절대로 제거해서는 안된다는 제 태도와 섞여 있습니다. – OOPMan

+0

@OOPMan : '아무 것도 삭제하지 마라'라는 견해에 상당한 동정을 느낀다. 임시 데이터베이스는 명시 적으로 지원합니다 (또는 수행 할 수 있음). 그러나, 나는 레코드가 실제로 사라지는 것을 의미하는 용어 DELETE의 전통적인 정의를 사용하고있었습니다. –

0

비슷한 기능을 지원하는 RDBMS가 없다고 생각합니다. 관계형 구조는 먼저 이들에게 제공해야하는 것이며, 일반적으로 관계를 구축하는 데 도움이되지 않습니다.

한편,이 질문과 관련된 DataObjects.Net의 멋진 기능을 설명 할 수 있습니다 : 일반 인스턴스 자동 등록.

[HierarchyRoot] 
public class A : Entity 
{ 
    [Field, Key] 
    long Id { get; set; } 

    // ... 
} 

[HierarchyRoot] 
public class B : Entity 
{ 
    [Field, Key] 
    int Id { get; set; } 

    // ... 
} 

// Note: it is a descendant of B 
public class C : B 
{ 
    // ... 
} 

그리고 또 하나 개의 영속 클래스 추가 :

[HierarchyRoot] 
public class AuditData<T> : Entity 
    where T: Entity 
{ 
    [Field] 
    [Association(OnTargetRemove = OnRemoveAction.None)] // This ensures 
    // FK won't be created 
    T Source { get; set; } 

    // ... 
} 

데이터 객체를

는 3 개 지속적인 유형이 상상해보십시오.인터넷이 자동으로이 유형의 두 인스턴스에 대한 지속성을 제공합니다 : (A의)

  • AuditData (B의)
  • AuditData

그러나 당신이 C 중 (AuditData을 만들 수 없습니다), AuditData (Of B)가 있기 때문입니다. 따라서 제네릭 형식 제약 조건을 기반으로 등록 할 대상을 결정합니다. 외래 키의 작성을 피하는 것이 쉽다는 것도 보여줍니다.

1

Btw는 분명히 다른 모든 테이블의 구조로 감사 테이블의 구조를 업데이트하는 일부 로직을 구현하여 RDBMS만으로 비슷한 기능을 구현할 수 있습니다.

  1. 추출 모든 테이블의 구조는
  2. 이 그들 사이의 "계층 뿌리"를 찾기 감사 할거야 : 당신은에이 사실, 당신은 단지 테이블 을 유지해야하는 기본 키 ISN ' 다른 테이블에 의 외래 키로 표시되지 않았습니다.
  3. 각 계층 루트에 대한 감사 테이블을 생성 (또는 재구성)합니다. 원본 테이블 키가 포함 된 교체 가능한 열 집합이 포함 된 템플릿이 필요합니다.

일반적으로 이것은 쉬운 일이 아닙니다. SQL DOM과 같은 도구가 있더라도 스키마를 추출하고 해당 부분을 빌드 할 수 있습니다.