製品のバンドルを含む製品のデータベース設計


13

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

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

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

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

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

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

回答:


16

あなたが記述されているパターンは、しばしば「と呼ばれる部品の爆発」や「部品表。」これは、データ構造の研究におけるグラフとツリー部分の一部です。ソリューションの本質は、特定の「製品」を他の「製品」で構成できることを認識することです。次に、設計は、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. データベース管理の実用的問題 - ファビアンパスカル。第7章は、私が見つけた最良かつ最も理解しやすい説明を提供します。
  2. Joe CelkoのSQL for Smartiesのツリーと階層、第2版。これは、SQL標準に固有のトピックに関する本全体です。
  3. エンタープライズモデルパターン - デビッドヘイ。すべての組織に共通するパターンに関する本(残念ながらER図はUMLで表示されますが、克服できます)には、ネットワーク構造の例がいくつかあります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.