私はしばらくの間、eBay のような分類法と特定の製品カテゴリに依存する属性を使用して、典型的な e コマース サイトをモデル化することについて考えてきました。
最初の試みは、EAV と Table Per Class db 継承モデリングのどちらかを選択することでした。パフォーマンスのために後者を選択しましたが、それが意味することは、個別の列としてモデル化された特定のカテゴリ属性 (テレビの解像度など) を持つ特定の (カテゴリ ツリーの葉) 製品カテゴリごとに専用のテーブルを作成することでした。
既存のカテゴリに属性を追加したり、新しいカテゴリを追加したりする必要がある場合、この設定は効率的ですが、柔軟ではありません。このような変更ごとに、次のものが必要です。
- テーブルの変更/作成
- このようなカテゴリを特定の属性でフィルタリングするための新しいフォーム
- 検索およびフィルタリング用のデータベース クエリを生成するための新しいコード
- 新しいカテゴリの製品を表示するためのいくつかの新しいビューモデル/DTO およびビュー
その複雑さに対処するには、これらの属性のある種のメタ表現が (アプリケーションの外部であっても) xml または Excel ファイルで必要であると思います。これにより、変更のたびに、言及されたすべてのコードが自動生成されます (sql/orm クエリ、アプリケーションコード、テンプレート)。したがって、開発には役立ちますが、それでもテストと追加の展開が必要です。
その時点で、eBay は実際には検索にリレーショナル データベースを使用しておらず、分類法が非常に柔軟であるため、新しいリーフ カテゴリを非常に迅速に追加できることを知りました。また、それらのカテゴリは、おそらくリレーショナル データベースでモデル化された階層ツリーのカテゴリではなく、単に検索属性 (ファセット) です。
最も有望な専用のファセット検索セットアップ (個別の Solr インスタンス) を簡単に調べた後、分類法の変更に柔軟に対応できるかどうかはわかりません。通常、Solr は何らかの形でリレーショナル DB をミラーリングするだけなので、特定のカテゴリ属性は依然としてDBMS メタデータとして DB でモデル化されます。属性をフィルタリングするための UI フォームを動的に生成することは、次の場合を除いて困難です。
1) EAV ファシオンを使用してデータを RDBMS に保持し、SOLR 検索を使用してパフォーマンスの問題を克服します (ただし、EAV の乱雑さ、データ整合性の強制などの問題はまだあります)
2) RDBMS に属性ディクショナリ (名前と型のみ) だけを保持し、検索機能とは別に非リレーショナル データ ストアのようなものとして使用して、特定の属性値を SOLR に格納します。アプリケーションがsolrと緊密に結合されるため(つまり、製品版の管理者CRUDがSOLRと直接やり取りするため)、このソリューションにも(たとえそれが可能であったとしても)確信が持てません。
あなたの考えは何ですか?このような (パフォーマンスの高い) 分類法では、柔軟なコード生成は避けられないと思いますか? それをどのように処理しますか?コード生成のためだけに、DB で EAV 方式の別のデータ ディクショナリがあるのでしょうか。MongoDB のようなものも使用できると思いますが、UI コードの生成 (実行時かどうかに関係なく) には何らかのメタデータが必要です。
ここには多くの質問がありますが、より大きなクラスの問題を扱うときの一般的な設計アプローチに興味があるため、小さな質問に分割したくありませんでした。