これは問題の単純化されたバージョンです。
大量のデータを送信してクエリを実行する顧客がいます。彼らは、データを照会できるいくつかの「パブリック」ID を持っている必要があります。(ほとんどの場合、データと一緒に送信する ID を介してシステムにクエリを実行したいと考えていますが、常にそうとは限りません)。簡単にするために、それらを「pid」、「crid」、「musicbrainzid」と呼びます。この情報を格納する「エンティティ」テーブルがあります。次のようになります (「権限」はデータの送信者です)。
entity
--
entity_id
authority // who sent the data
type // 'pid', 'crid', 'musicbrainz', etc.
value // the actual id value
次に、「エピソード」、「シリーズ」、「ブロードキャスト」などの個別のエンティティがあります (実際にはもっとたくさんありますが、ここでは単純にしています)。これらにはそれぞれ、エンティティ テーブルを指す entity_id があります。
外部の顧客は、どのように pid または crid を介して検索し、適切なエピソードまたはシリーズを取得し、それが何であるかを適切に識別することができますか? pid を指定すると、エンティティ ID を取得できますが、この値を求めてエピソード、シリーズ、ブロードキャスト テーブルを検索する必要があります。さらに、すべての ID が必ずしも他のすべてのテーブルに関連しているわけではありませんが、エンティティ (「エピソード」など) には複数の ID (pid、crid など) がある場合があります。
戦略:
- pid のエンティティ ID を見つけ、他のすべてのテーブルで pid を検索します。
- エンティティに「entity_type」列を配置しますが、それがエピソード テーブルの pid であるのに、誤って episode.type をシリーズとして設定した場合はどうなるでしょうか? データを複製したくないし、データベースのメタデータを列の値に入れたくありません。
オプション番号1は遅く、間違っているようです(さらに、さまざまなテーブルの構造が異なるため、問題が発生します)。
オプション 2 はデータが重複していることを意味し、このデータは同期しなくなる可能性があります。トリガーを使用してこれを強制することはできますが、これは非常にやっかいなことのように思えます。いずれにせよ、mysql トリガーの実装のバグに何度か遭遇しました。現在この戦略を使用していますが、トリガーはありません。
オプション 3 とは何ですか?
補足: すべての権限/タイプの組み合わせが有効であるとは限らないため、「権限」を別の表に分割する必要があることはわかっています。