私は、表現したいオブジェクトごとにテーブルを持つ代わりに、私が望むものを表現し、変更することさえできる一連の汎用テーブルを持つデータベースを作成することを考えていました (それは実際に私の主な関心事です)私が表すあらゆる種類のオブジェクトに関連付けられたデータ。
例として、美容院に予約を入れるための Web アプリケーションを作成しているとします。私が通常行うことは、データベースに次のテーブルを作成することです。
- クライアント
- hairdressers: FK: 美容師が勤務する会社のID
- 企業
- 予定: FK: その予定のクライアントと美容師の ID
しかし、より多くのデータを予約に関連付けたいと考える科学的な美容師を扱ったらどうなるでしょうか (たとえば、使用したシャンプーの量、ヘアカットのグラム数、はさみのストローク数など)。
その代わりに、次の表を使用できると考えていました。
- エンティティ: 私が望むものを表します。PK(エンティティ ID)
- group: はエンティティです (グループを作成するときは、最初にエンティティを作成し、その ID がグループの FK によって参照されます)。PK(グループ ID)、FK(エンティティ ID)
- entity_group: 各グループには複数のエンティティ (したがって他のグループも) を含めることができます: PK(entity_id, group_id)。
- 役割: 例: 管理者、クライアント、ヘアドレッサー、会社。PK(役割ID)
- entity_role: 各エンティティは複数のロールを持つことができます: PK(entity_id, role_id)
- メタデータ: メタデータの名前とタイプ、関連するロール、および必須かどうかを示すフラグが含まれます。PK(metadata_id)、FK(metadata_type_id、role_id)
- metadata_type: 使用可能なメタデータ タイプに関する情報が含まれます。PK(メタデータ タイプ ID)
- メタデータ値: PK(メタデータ値_id)、FK(メタデータ_id)
- metadata_ : char、text、integer、double、datetime、date などのさまざまなタイプのさまざまなテーブル。エンティティに関連付けられたメタデータの実際の値を含むPK(metadata_ _id)、FK(metadata_value_id)。
- entity_metadata: クライアントの名前、会社の住所など、エンティティに関連付けられたデータが含まれます... PK(entity_id, metadata_value_id)。メタデータのタイプを使用して、対応するテーブルでこのエンティティのメタデータの実際の値を選択できます。
これにより、完全に柔軟なデータ構造を持つことができますが、いくつかの欠点があります。
- エンティティに関連付けられたメタデータを選択すると、コード内でエンティティの表現を作成するためにコード内で処理する必要がある複数の行が返されます。
- 複数のエンティティのメタデータを選択するには、上記と同じプロセスをループする必要があります。
- メタデータを選択するには、所有している metadata_* テーブルごとに選択を行う必要もあります。
一方で、いくつかの利点もあります。たとえば、ほとんど入力されない多数のフィールドを持つクライアント テーブルを用意する代わりに、必要な正確な数の行を使用するだけです。
これはまったく良い考えですか?
私が達成しようとしていることを明確に表現できたことを願っています。それを達成する方法を考えたのは私が初めてではないと思いますが、その質問に対する答えを見つけるための適切なキーワードを見つけることができませんでした :/
ありがとう!