30

e コマース アプリケーション用のデータベース/ドメインを設計していますが、製品を保存する方法を理解するのに苦労しています。

このウェブサイトでは、ペン、皮ひも、タトゥー、傘など、あらゆる商品を幅広く販売します。これらの各製品には、高さ、幅、長さ、重量などのいくつかの共通の属性がありますが、一部の製品には特別なデータがあります。たとえば、ペンにはさまざまなインクの色があり、ペン先/ふたやパンフレットにはさまざまな種類の折り目があります。これまでに 20 以上の追加の属性を考えましたが、これらの属性は Web サイト上の製品の 1% にしか適用されない場合があります。

そのため、余分なデータを処理するために EAV モデルを実装することが適切かどうか疑問に思っています。顧客がフロントエンドでサイトを閲覧している場合、eBay や carsales.com.au のようなフィルタリング サイドバーが表示されることに注意してください。(そのため、かなりのクエリが発生することに注意してください)

システムの柔軟性を維持する必要があるため、クラス テーブルの継承を実装するのは実用的ではないと思います。これは、今後、新しいタイプの製品でより多くの属性が追加される可能性があるためです。

私が検討したもう 1 つのことは、NoSQL データベース (おそらく MongoDB) を使用することですが、これらのタイプのデータベースの経験はほとんどありません。問題は解決しますか?

オプションのレビュー:

  1. 多くの列を持つ単一の製品エンティティ
  2. 個別属性エンティティ (EAV)
  3. スキーマレス永続性に切り替える

私は、属性エンティティを使用してプロトタイプを作成し、それがどれほど柔軟であるかを確認し、パフォーマンスとクエリがどのように制御不能になるかをテストしています。

編集:もちろん、私は他の解決策を受け入れます。

4

3 に答える 3

69

素晴らしい質問ですが、もちろん、「唯一の正しい方法」はありません。@BenV によると、Magento は EAV モデルを使用します。私の経験は圧倒的に肯定的ですが、他のユーザーをつまずかせます. いくつかの考慮事項:

1.パフォーマンス。 EAV では、オブジェクトに関連する属性を設定するために、複雑な複数テーブルの結合が必要です。これにより、パフォーマンスが低下します。ただし、これは慎重なキャッシング (クエリ キャッシングを含む、スタック全体のすべてのレベル) と非正規化の選択的な使用によって軽減できます。Magento では、管理者は、SKU の数 (通常は数千) が保証するカテゴリおよび製品の非正規化モデルを選択できます。そのためには、インデックスの再作成をトリガーするオブザーバー (常に有効です) と、製品データが変更されたときに「フラットな」非正規化テーブルへの更新が必要です。これは、管理者へのプロンプトでスケジュールまたは手動でトリガーすることもできます。

2. サード パーティ ユーザーの複雑さ このアプリケーションを他のユーザーが利用できるようにすることを計画している場合、多くの人は EAV が複雑すぎると感じ、ユーザー フォーラムで多くの暴言や無知な悪用に対処することになります (Magento を参照!!)。 .

3. 将来の拡張性とプラグイン アーキテクチャ。 拡張性が重要な要素である場合、EAV モデルが真価を発揮することは間違いありません。既存の ORM およびコントローラー コードを壊すリスクを最小限に抑えながら、新しい属性をモデルに追加するのは非常に簡単です。

4. データ型 EAV の変更により、属性のデータ型を変更することが少し難しくなります。初期の設計で特定の属性データ型が将来変更される場合 (たとえばintvarcharなど)、その属性のすべてのレコードを、新しいデータ型に一致する対応するテーブルに移行する必要があります。もちろん、純粋主義者は最初から正しく設計することをお勧めしますが、現実が邪魔をすることもあります!

5. 製品の手動インポート EAV がほとんど不可能にすることの 1 つは、SQL および/または phpMyAdmin スタイルの CSV/XML を使用して製品 (または他のエンティティ) をデータベースにインポートすることです。構造化データを受け取り、それをアプリケーションのモデル層を介して渡してデータベースに永続化する Importer モジュールを作成する必要があります。それはあなたの複雑さを増します。

于 2010-11-01T04:05:50.280 に答える
0

Doctrine 2 ORM と OXM プラグイン (https://github.com/doctrine/oxm) を詳しく調べることをお勧めします。さまざまな属性で問題を解決します。もちろん、検索可能なカスタム属性のインデックスを作成する必要がありますが、問題になるとは思いません:)

コミュニティ メンバーの数を気にしない場合は、MongoDB も使用できます。

于 2011-03-11T10:48:44.837 に答える
0

オープンソースのショッピング カートMagentoでは、EAV デザインを使用して製品のカスタム属性を使用できます。データベース スキーマはこちらで確認できます。

于 2010-11-01T03:52:41.653 に答える