私は、ユーザーがさまざまなタイプのオブジェクトを主張できるシステムを持っています--
Teams,
Facilities,
Equipment,
Personnel
ユーザーは、組織の円グラフの自己完結型スライスである「セル」で表されます。これらのオブジェクトのいずれかのクレームを作成したら、クレームのステータスを設定できます。単純に思えますよね?
さて、ここから頭痛が始まります。これらは、前述のように緩やかな階層を形成します。スーパー ユーザーは、少数のリンク テーブルを使用して、これらの各オブジェクトのテンプレートを作成します。チームは施設、機器、および人員で構成でき、施設は機器と人員で構成され、セルは必要なものに対するクレームを作成できます。非常に柔軟ですが、バックエンドでは面倒です。
Team、Facility、Equipment、および Personnel にはまったく同じ列があります。
Id,
Name,
Description,
DateCreated,
CreatedById,
IsArchived
ORM の概念に沿って、現時点ではそれぞれが個別のテーブルです。ユーザーがクレームを作成する必要がある場合、本当の苦痛が生じます。階層により、次のテーブルが残ります。
TeamClaim, FacilityClaim, EquipmentClaim, PersonnelClaim, TeamFacilityClaim,
TeamEquipmentClaim, TeamPersonnelClaim, so on and so forth.
さらに、これらのクレーム テーブルごとに別のステータス テーブルがあります。
明らかに、これはただのゴミです。
そこで、ClaimableItem という単一のテーブルにデザインを変更しました。上記で定義された列に加えて、「タイプ」列があります。それは単なる 3 文字の表現です。次に、Claim という 1 つのテーブルを作成しました。このテーブルには、必要な列がすべて含まれており、ClaimableItemId および ClaimableItemType として定義された複合一意キーが含まれています。
これは既に C# コードでテスト済みです。EF4 はキーの再利用を嫌うかもしれませんが、マイナーな回避策 (ハック) により、比較的簡単に実行できるようになりました。モデル、ビュー、コントローラーのコードをすべて変更して、約 1 時間で新しいものに対応できます。
私の質問 (最後に) は次のとおりです。 データベースがテーブルで雑然とするのを防ぎ、実際に新しい ClaimableItem タイプの追加を促進します。新しいオブジェクトを作成する必要はありません。私の問題は、3 文字の表現が直観的ではなく、コードで処理する必要があり、私の純粋主義者に対して一種の苛立ちを感じていることです。
これを行う方法を知っている人はいますか?