2009-06-24 28 views
3

まず、私はthis StackOverflow questionを読んだので、それに向けて私を指摘する必要はありません。テーブルに依存しない外部キー?

私は今、同様の問題に取り組んでいます。具体的には、db内の他のテーブルに関する監査情報を格納するために使用される監査テーブルを持つデータベースがあります。この表の基本的な形式は次のとおりです。

ID、実体識別子、EntityTypeID、ActionTypeID、今のDateTime

、あなたが推測できるように、実体識別子の一般的な性質は、このテーブルへとからの外部キー関係がにトリッキーであることを意味しますORMシステムを使用して特にあなたと管理してください。

もちろん、不快な作業の解決策は、必要なクエリを手動で行い、それがうまくいくところでORMのものを使用することです。

しかし、この問題は、Table:IDを定義するための外部キー関係を可能にするRDBMSが存在するかどうかという疑問を私の心に浮き彫りにしました。そして:つまり

は、RDBMSで、EntityTypeID列かもしれないが、そのような

'1テーブルA' などの値が含まれている 'TableBのを:somekey'

そう...

がありますこれを行う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; } 

    // ... 
} 

のDataObjectを

は、あなたが3永続的な種類があります想像してみてください。ネットは自動的にこのタイプの2つのインスタンスの永続性を提供します:(Aの)

  • AuditData(Bの)
  • AuditData

しかし、それはあなたがCのうち(AuditDataを作成することができません。 )、AuditData(Of B)があるためです。したがって、ジェネリック型制約に基づいて登録するものを決定します。また、外部キーの作成を避けることも容易であることが示されています。

1

Btwは明らかに、他のすべてのテーブルの構造によって監査テーブルの構造を更新するロジックを実装することによって、RDBMSだけで同様の機能を実装できます。あなたはする必要があります:実際には、あなたはどの主キーISN」 テーブルのみを保持する必要があります。

  1. あなたは
  2. は、それらの間の「階層の根」を検索監査するつもりだすべてのテーブルの構造を抽出します別のテーブル に外部キーとしてマークされていません。
  3. 各階層ルートの監査テーブルを作成(または再構成)します。 ソーステーブルキーを含む置き換え可能な列のテンプレートが必要です。

一般的に、これは簡単な作業ではありません。たとえSQL DOMのようなツールを持っていても、スキーマを抽出してその部分を構築することができます。

関連する問題