0

私は、ユーザーがさまざまなタイプのオブジェクトを主張できるシステムを持っています--

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 文字の表現が直観的ではなく、コードで処理する必要があり、私の純粋主義者に対して一種の苛立ちを感じていることです。

これを行う方法を知っている人はいますか?

4

2 に答える 2

1

まず、いくつかの誤った仮定があります。

  1. 特定の方法でテーブルを作成することは、「ORM の概念を維持する」ことではありません。
  2. タイプごとに個別のテーブルを用意する必要はありません
  3. いたるところにリンク テーブルを配置する必要はありません。

ほとんどの ORM は、列識別子 (通常は何らかの種類の値) を使用する継承の形式をサポートしています。これは、提案したソリューションと同じです。

これは、データ モデルとデータベースを設計するための非常に実用的で実用的な方法ですが、参照整合性と制約を使用して特定の値のみが特定のことを意味するようにすることができるため、正確には「純粋な」データベース設計概念ではありません。

たとえば、TeamClaim リンク テーブルがある場合、結合されたすべての値がチームとクレームであることを (参照整合性を使用して) 保証できます。これは、これらがデータベース内の別個のエンティティであるためです。

チームと請求をリンクするつもりで、代わりに施設と請求をリンクするとどうなりますか? おっとっと。そして、データベースがあなたが間違いを犯したことを知る方法はありません.

これは、1 つの真のルックアップ テーブルの問題に似ています。

しかし、多くの人にとって、参照整合性の喪失は、柔軟性を高めるために支払う小さな代償です。コードには細心の注意を払う必要があり、人々が手動でテーブルをいじることを許可しないでください。

于 2013-01-14T22:38:28.010 に答える
0

継承の素晴らしいケースのように聞こえます。からTeams, Facilities, Equipment, Personnel継承しClaimableItemClaim参照を作成しますClaimableItem

これは実際にあなたが提案したものと非常によく似ています。あなたが言った:

そこで、ClaimableItem という単一のテーブルにデザインを変更しました。上記で定義された列に加えて、「タイプ」列があります。それは単なる 3 文字の表現です。次に、Claim という名前のテーブルを 1 つ作成しました。このテーブルには、必要な列がすべて含まれており、ClaimableItemId および ClaimableItemType として定義された複合一意キーが含まれています。

複合外部キーは必要ないと思います。これらTypeの識別子列はClaimableItemテーブルに配置できます。

これは純粋ですか?それはそうですね。継承に最適なケースです。

最後のコメント:そのような場合は直感に従ってください。解決策がくだらないと感じ、もっとシンプルなものを望んでいることに気付いた場合は、それを選択してください。トレードオフは時に不明確な選択であり、開発者は長期的に何が正しいかを本能的に判断することを時間の経過とともに学びます。

于 2013-01-14T22:24:00.137 に答える