6

カタログ内の各製品タイプの複雑な詳細を可能にする製品カタログを作成したいと思います。製品タイプには、それらに関連付けられた非常に異なるデータがあります。一般的なデータのみを含むもの、データのいくつかの追加フィールドを含むもの、その製品タイプに固有の多くのフィールドを含むものがあります。新しい製品タイプをシステムに簡単に追加し、それらの構成を尊重する必要があります。これらの製品のデータモデルを設計する方法、および永続性と取得を処理する方法に関するヒントが大好きです。

一部の製品は非常に一般的であり、それらの製品を編集するために共通のUIを使用する予定です。拡張可能な構成が関連付けられている製品は、編集用に作成された新しいビュー(およびコントローラー)を取得します。すべてのカスタム製品には独自のモデルが定義されていますが、共通の基本クラスを共有していると思います。基本クラスは、カスタムフィールドを持たない汎用製品を表します。

処理する必要のある製品の例:

  1. ジェネリック製品
    • 説明
  2. 電球
    • 説明
    • タイプ(蛍光灯、白熱灯、ハロゲン、LEDの列挙型)
    • ワット数
    • スタイル(洪水、スポットなどの列挙型)
  3. 冷蔵庫
    • 説明
    • 作る
    • モデル
    • スタイル(ドメインモデルに列挙型を含む)
    • 浄水器情報
      • 部品番号
      • 説明

システムで利用可能な製品タイプを見つけるためにMEFを使用することを期待しています。製品タイプのモデル、ビュー、およびコントローラーを含むアセンブリを作成し、それらのアセンブリをビンにドロップして、アプリケーションに新しい製品タイプを検出させ、ナビゲーションに表示することを計画しています。

  1. SQL Server 2008を使用して、これらのさまざまなタイプの製品を格納し、データベーススキーマを拡張せずに新しいタイプを追加できるようにするための最良の方法は何でしょうか。

  2. データベースからデータを取得する場合、これらの多態的なエンティティを正しいドメインモデルに変換するための最良の方法は何ですか?


更新と明確化

  1. 内部プラットフォーム効果を回避するために、(そのタイプの製品を格納するために)すべての製品タイプのデータベーステーブルがある場合でも、製品タイプにまたがるすべての製品を取得する方法が必要です。それはどのように達成されますか?

  2. 私は彼のSharePointリファレンスについてNikhilkとより詳細に話しました。具体的には、彼はこれについて話していました:http: //msdn.microsoft.com/en-us/library/ms998711.aspx。それは実際にはかなり魅力的なようです。XMLを解析する必要はありません。また、データに対する単純で高速なクエリを可能にするために実行できるインデックスがいくつかあります。たとえば、行の最初のint列が電球を表す場合のワット数であることがわかると、「75ワットの電球をすべて検索する」と言えます。アプリ層の何か(NHibernate?)は、製品タイプからuserdataスキーマへのマッピングを定義します。

  3. 製品ごとに多くの行が発生する可能性があるため、プロパティテーブルを持つスキーマに反対票を投じました。これはインデックスの問題につながる可能性があり、さらにすべてのクエリは基本的にデータをピボットする必要があります。

4

6 に答える 6

2

文字列列のセット、int 列のセットなどと Type 列を持つ SharePoint スタイルの UserData テーブルを使用します。

次に、各型のスキーマ、つまりそのプロパティ、および UserData テーブル内のそれらがマップされる特定の列を指定する型テーブルのリストがあります。

Azure やその他のユーティリティ コンピューティング ストレージなどでは、テーブルを定義する必要さえありません。すべてのストア オブジェクトは基本的にディクショナリです。

于 2009-02-04T17:08:31.033 に答える
1

次のようなデータモデルを使用する必要があると思います-

製品表

  • 製品 ID (PK)
  • 商品名
  • 詳細

プロパティ テーブル

  • プロパティ ID (PK)
  • 製品 ID (外部キー)
  • ParentPropertyId (FK - プロパティを分類するための自己参照)
  • プロパティ名
  • プロパティ値
  • PropertyValueTypeId

プロパティ値ルックアップ テーブル

  • PropertyValueLookupId (PK)
  • プロパティ ID (外部キー)
  • 参照値

そして、これに基づいて動的なビューを作成します。PropertyValueTypeId 列を使用して、(0-string、1-integer、2-float、3-image など) のような規則を使用して型を識別することができますが、最終的にはすべて型なしのみを保存できます。この列を使用してコントロール テンプレートを選択し、対応するプロパティをユーザーに表示することもできます。

値ルックアップ テーブルを使用して、特定のプロパティのルックアップを保持できます (ユーザーがリストから選択できるようにするため)。

于 2009-02-04T06:52:35.503 に答える
0

予想される共有構造を従来の正規化された 3NF モデルに可能な限り配置し、必要に応じて XML 列を追加します。

MEF (またはその他の ORM) がこれらすべてを透過的に実行できるとは思えません。

于 2009-02-04T06:35:52.510 に答える
0

ジェフ、

現在、Products テーブルの XML フィールドを使用して、すべての製品固有のデータを処理しています。したがって、Products テーブルには、すべての製品が共有するいくつかの共通フィールド、特定の製品が追加で必要とするものをすべて含む XML、および XML を取得して頻繁にクエリされるフィールドの一部を「仮想」フィールドとして表示するいくつかの計算フィールドがあります。 Products テーブル (たとえば、"Style" は、現在の製品が定義するものに設定されるか、製品に Style プロパティがない場合は NULL に設定されます)。

これまでのところ、私たちはそのアプローチに非常に柔軟に対応してきました。XML 用にまともな XSD スキーマを作成すれば、これらのフィールド用の C# プロキシ クラスを作成することさえできます。

リレーショナルと XML の両方の世界の長所を組み合わせて、私たちにとってうまく機能します。

マルク

于 2009-02-04T18:04:09.423 に答える
0

Inner Platform Effectを回避し、実際に特殊なエンティティのテーブルを作成する必要があると思います。それらを管理するための特定のコードを作成するので、適切なバッキング テーブルも用意しないのはなぜですか?

アセンブリをドロップしてスクリプトを実行するなど、展開が少し難しくなりますが、長期的にはおそらく多くの労力を節約できます。

于 2009-02-04T07:07:25.067 に答える