求人情報を格納する既存のデータベース設計があります。
"Vacancy" テーブルには、"役職"、"説明"、"給与範囲" など、すべてのクライアントに共通する多数の固定フィールドがあります。
「マネージャー名」、「勤務時間」など、クライアントが自分で設定できる「カスタム」フィールドの EAV デザインがあります。フィールド名は「ClientText」テーブルに保存され、データは VacancyId、ClientTextId、および Value とともに「VacancyClientText」テーブルに保存されます。
最後に、欠員がいる場所/オフィス、必要なスキルのリストなどで、欠員をカスタムタグ付け/分類するための多対多のEAV設計があります。これは、タグのタイプを一覧表示する「ClientCategory」テーブル、「Locations、Skills」、各カテゴリの有効な値を一覧表示する「ClientCategoryItem」テーブル (例: 「London,Paris,New York,Rome」、「C#、 VB、PHP、パイソン」。最後に、欠員のために選択された各アイテムの VacancyId と ClientCategoryItemId を含む "VacancyClientCategoryItem" テーブルがあります。
クライアントが追加できるカスタム フィールドまたはカスタム カテゴリの数に制限はありません。
現在、既存のシステムと非常によく似た新しいシステムを設計していますが、クライアントが持つことができるカスタム フィールドの数を制限する機能があり、ゼロから構築されているため、対処するレガシーの問題はありません。
カスタム フィールドの場合、私のソリューションは単純です。Vacancy テーブルに CustomField1-5 という名前の 5 つの追加の列があります。これにより、EAV デザインの 1 つが削除されます。
私が苦労しているのは、タグ付け/カテゴライズのデザインです。クライアントのタグのカテゴリ/タイプを 5 つに制限するとします。可能な値「CustomCategoryItems1-5」をリストする 5 つのテーブルを作成し、さらに多対多のテーブル「VacancyCustomCategoryItem1-5」を 5 つ作成する必要があります。
これにより、10 個のテーブルが既存のシステムの 3 つのテーブルと同じストレージを実行することになります。
また、5 つではなく 6 つのカスタム カテゴリが必要であるという点で要件が変更された場合 (非常に禁じられています)、これにより多くのコードが変更されます。
したがって、そのようなデータの保存により適した DB 設計パターンを誰でも提案できます。私は EAV アプローチに固執することに満足していますが、既存のシステムは、そのような設計に関連するすべての通常のパフォーマンスの問題と複雑なクエリに遭遇しました。
アドバイス/提案は大歓迎です。
使用される DBMS システムは SQL Server 2005 ですが、特定のパターンで必要な場合は 2008 もオプションです。