5

私たちのシステムのプロセスは、特定のルールに従ってファイルを送信する責任があります。ファイル名に応じて、ファイルを顧客または工場に送信できます (ただし、両方には送信できません)。

ルールの各行には、ファイル名フィルター、それが属する顧客と工場が含まれ、ファイルの暗号化、分割、結合、名前変更などの必要があるかどうか、宛先フォルダーなどの他のパラメーターを指定します。

その過程で、ファイルが属する工場と顧客を認識し、工場と顧客のルールを調べて、フィルターに一致するファイルにルールを適用します (顧客のルールが優先されます)。

データベース内のルールと顧客/工場との関係を表す最良の方法は何ですか? データベースには既に Customer テーブルと Factory テーブルがありますが、関係を表す最良の方法が思いつきません。ルールの各行には、FK が 1 つだけあります (Customer または Factory のいずれかであり、両方を持つことはできず、何も持たないこともできません)。これを表す方法の 1 つは、次のようになります。

ここに画像の説明を入力

しかし、これは 2 つの FK のうちの 1 つしか持てないという事実を捉えていません。そのうちの 1 つが有効な FK で、もう 1 つが空でなければならないという制約を設定できますが、あまりクリーンではないようです。さらに、ルールの他の決定要因 (国など) があると、さらに醜くなります。このデザインを改善する方法はありますか?

システムが .NET で開発されていることを指定することも役立つと思います。また、オブジェクト リレーショナル マッピング、つまり NHibernate を使用します。

4

4 に答える 4

6

テーブルの継承を見てください。

次のようなものを使用できます。

Rule
  int RuleId
  int TypeRule
  PK (RuleId)
  UQ (RuleId, TypeRule)

CustomerRule
  int TypeRule = 1
  int CustomerId
  FK (TypeRule, RuleId)
  FK CustomerId

FactoryRule
  int TypeRule = 2
  int FactoryId
  FK (TypeRule, RuleId)
  FK FactoryId

このようなシステムでは、両方ではなく、顧客ルールまたは工場ルールのいずれかを使用します。さらに、明日 CountryRule を追加するのは簡単です。

于 2013-01-12T08:27:32.110 に答える
3

Hibernate とそのTable-per-Subclass Mapping Strategyを使用すると、抽象的なルール クラスを定義し、Customers と Factory に特化して、次のようにクラス階層をリレーショナル データベース スキーマにマップできます。

マッピング

于 2013-01-15T16:59:31.133 に答える
1

2つのFKの代わりに新しいエンティティを導入するのはどうですか?3つのフィールド、つまり独自のPKと2つのFKがあります。これらのFKの1つを空にするためのカスタムロジックを導入できるようになるよりも。そのタスクにFKが1つだけあり、それぞれのエンティティが詳細を処理することが論理的に明確になります。

于 2013-01-20T23:02:26.580 に答える
1

これに制約を使用したくないという事実に言及していることは知っていますが、回答とそれらがテーブル継承の方向を指しているという事実を読んで、私の個人的な経験を少しお話ししたいと思います。

データベースはオブジェクト指向の原則を複製することを意図しておらず、NHibernate についてはよくわかりませんが、Entity Framework は非常に厳格であり、この継承を実装すると、いくつかの型に継承したいという事実にぶつかる可能性があります。不可能です(EFでは事実です)。私が言いたいのは、customerrule と factoryrule の両方として定義できるルールがあるということです (または、システムが将来認識するその他のタイプのルール)。

私はテーブルの継承と制約の実装の両方を行いましたが、後者は最終的に最も柔軟なモデルを提供してくれました。このソリューションには今でもかなり満足しています。最小限の労力で最も単純なアプローチを考えているのは良いことですが、複雑な問題にはそれほど単純ではない解決策が必要な場合もあります。

于 2013-01-21T08:17:53.227 に答える