プロジェクトでここで説明されているようなテーブルを使用するように誰かが私に提案しました。理由はわかりませんが、それは良い考えではないと思います。
MyTable(MyTableId PK、タイプINT NOT NULL、MyForeignKey INT NOT NULL)
MyForeignKeyは、Typeの値に応じて、さまざまなテーブルのデータを指すことができます。もちろん、そのようなモデルを使用してFKの整合性を強制することはできませんが、この議論はそれを使用しないのに十分ですか?
これを使用できる場所の例を示します。さまざまなオブジェクトに関するNotesを保存するためのNotesテーブルがシステムにあるとします。ユーザー、ドキュメントなどに関するメモ。通常、私はこれを次のようにモデル化します。
メモ(NoteId PK、Text VARCHAR(4000)、UserId INT NULL、DocumentId INT NULL、...)
私の同僚が提案しているのは、代わりにそのようなテーブルを用意することです。
メモ(NoteId PK、Text VARCHAR(4000)、ObjectType、ObjectId)
2番目の実装では、ObjectTypeは、ObjectIdがUsersテーブルまたはDocumentsテーブルの行を指しているかどうかを示します。別のタイプのオブジェクトを追加する場合は、データベース構造とコードの変更が少なくて済むという利点があります。
各ソリューションの長所と短所は何ですか?
注:無数のオブジェクトタイプが存在することはありません。10未満のままにする必要があります。
実際、私たちの実際のシナリオはもう少し複雑です。これは、ユーザーがさまざまなタイプのオブジェクト(ドキュメント、メモ、イベントなど)にアクセスできる場合とできない場合がある許可システムと関係があります。
したがって、今のところ私のデータベースモデルには、これらのオブジェクトのテーブルと、オブジェクトとユーザー(UserDocuments、UserNotes、UserEventsなど)との関係を作成するための追加のテーブルがあります。アクセス許可は、これらのリンクテーブルの属性を介して設定されます。
私の同僚は、代わりにこのような単一のパーミッションテーブルを持つことを提案しています
パーミッション(PermissionId PK、UserId INT、ObjectType、ObjectId、...その他のパーミッションフィールド...)
これは良い考えですか?
また、これをEAVまたはOpen Schemaと呼ぶことはできますか?それは私がそれらのトピックについて読んだものとまったく同じではありません。