web-dev-qa-db-ja.com

製品のバンドルを持つ製品のデータベース設計

小売業向けのデータベースシステムを構築しています。私はいくつかのテーブルを設定しました:

  • 製品
  • 購入
  • 売上高
  • 残高

すべてが相互に接続されており、私の在庫レベルを表示できます。

私が抱えている問題は、個別の価格とは異なる価格の製品のバンドルも販売していることです。
例:オレンジを$ 1で販売し、Appleは$ 1.2、果物パッケージ1(オレンジ2つとリンゴ2つ)は$ 3.8、パッケージ2(オレンジ4つと4つりんご)7ドル。

これらの製品バンドルの関係を作成する正しい方法はありますか?

PS:私はFileMaker Proを使用してこれを作成しています。

14
shandery

説明しているパターンは、「 部品の爆発 」または「 部品表 」と呼ばれることがよくあります。これは、データ構造の研究における グラフとツリー の一部です。ソリューションの本質は、任意の「製品」が他の「製品」で構成できることを認識することです。この設計はネットワーク構造であり、他の製品で構成されているかどうかに関係なく、各製品の行があるProductテーブルがあり、次にProduct Componentテーブルには、他の製品で構成される各製品と、その製品のコンポーネントである対応する各製品の行があります。あなたの場合、各製品には価格があります。だからあなたはこのようなものを持っているでしょう

Product
-----------------------------------
|Name             |Price          |
-----------------------------------
|Orange           |1             |
|Apple            |1.20          |
|Fruit Package    |3.80          |
-----------------------------------

Product Component
----------------------------------------------------------
|Product               |Contains                |Quantity|
----------------------------------------------------------
|Fruit Package         |Orange                  |2       |
|Fruit Package         |Apple                   |2       |
----------------------------------------------------------

この設計は、実際には2つのエンティティタイプ(ノードとリンク)を明確に分離するため、再帰的な関連付けを持つ単一のテーブルよりも適しています。この場合、製品はノードであり、製品コンポーネントはリンクです。

ネットワーク設計は一般的な構造ですが、完全に満たされると、深さが変化する再帰的な構造になるため、クエリを実行すると問題が発生します。 OracleやSQL Serverなどの産業用DBMSには、クエリを宣言型にするのに役立つ特別な言語要素(OracleのCONNECT BYおよびSQL Serverの再帰CTE)があります。私がほとんど知らないFile Maker Proを使用している場合、そのような言語構造が役に立たない可能性があり、ネットワークを横断するためのプロシージャコードを記述する必要があるかもしれません。ただし、ネットワークの深さが一定であることが判明した場合、この問題は緩和できます。たとえば、すべての製品にコンポーネントがないか、コンポーネントのレベルが1つあるとします。次に、データベース設計におけるネットワーク構造に関する参考資料をいくつか示します。

  1. データベース管理の実際的な問題 - Fabian Pascal 。第7章では、私が見つけた最もよく理解できる説明を提供します。
  2. SQL for SmartiesのJoe Celkoのツリーと階層、第2版 。これは、SQL標準に固有のトピックに関する本全体です。
  3. エンタープライズモデルパターン - David Hay 。すべての組織に共通のパターンに関する書籍(残念ながらERダイアグラムはUMLで表示されますが、克服できます)には、ネットワーク構造の例がいくつかあります。
16
Todd Everett