2011-12-18 6 views
0

私は近いうちに実装する予定のMySQLデータベースの大まかな設計をしていますが、技術的に正しいかどうかはわかりません。私は私の心の中で、データベースの設計で、したがって疑問を正式な教育を取られたことがない:MySQLデータベースデザイン

エンティティ/テーブル

  1. 商品(P_ID、名前)
  2. パッケージ(P)ID、名前)
  3. Default_Package(* Commodity_ID、* PACKAGE_ID、P_ID)
  4. Custom_Package(* Commodity_ID、* PACKAGE_ID、ORDER_ID、P_ID)
  5. 注文(P_ID、PACKAGE_ID、Custom_Package = 0)

これは、システムが動作するように設計されてどのように基本的である:

  1. 管理者は、
  2. ユーザーがデフォルトのパッケージを購入する必要がdefault_packageテーブルに格納されているデフォルトのパッケージの束を作成しますOrder_IDテーブルのPackage_IDフィールドで参照されています
  3. ユーザーはデフォルトパッケージをカスタマイズできます。彼らがそうすることを選択した場合、Custom_Packageフィールドは1にフリックされ、カスタムパッケージの情報はCustom_Packageテーブルに格納されます。

  4. ルックアップを実行すると、ordersテーブルのcustom_packageフィールドがチェックされます。 0の場合、packageはdefault_packageリストから取得されます。これは、注文に戻って参照するすべてのレコードを取得することによってCustom_Packageリストから取得されます。

データベース設計と実装に関する私の経験から、これはうまくいくはずです。しかし、これが最善の方法であるかどうかはわかりません。

誰かが意見を分かち合うことができたら本当に感謝します。

:)

+0

別の理由がない限り、デフォルトのパッケージとカスタムパッケージを1つのテーブルに入れ、フィールドを示しますパッケージの種類また、パッケージIDが一意である(つまり、すべてのパッケージに一意の名前がある)場合、このデザインに基づいて、パッケージにそれ自身のテーブルが必要な理由がわかりません。 – Sparky

+0

パッケージテーブルを削除すると、反復的なデータ・セットを独自の表に入れることを求める正規化規則パッケージは複数の商品で構成されています。したがって、複数の商品を含むパッケージの場合、商品IDごとにパッケージ名が繰り返されます。 カスタムパッケージとデフォルトパッケージを1つのテーブルに移動すると、既定のパッケージを取得しようとするたびにWHERE句をどのように含める必要があるかを考慮して、少し時間をかけて検索する必要があります。 1つ余分なテーブルは本当に傷ついてはいけません。 – captainspi

+0

あなたの例に基づいて、私は同意します、コモディティテーブルは別々でなければなりません。あなたのレスポンスに基づいて、私はパッケージが名前の小さなセットであると仮定しているので、同じテーブルにあるべきではありません(リピートを防ぐため)。 – Sparky

答えて

0

私の考え、あなたの例やコメントに基づいて:

それはあなたの「パッケージ」に表示されるパッケージ名や商品名の組み合わせは?

  1. 商品(P_ID、名前)
  2. パッケージ(P)ID、名前)

Iは、以下の二つのテーブルを合わせます:

3. Default_Package (* Commodity_ID, * Package_ID, P_ID) 
4. Custom_Package (* Commodity_ID, * Package_ID, Order_ID, P_ID) 

3. Packages (P_ID, * Commodity_ID, * Package_ID, P_type=0/1) 

、その後、私は注文テーブルにフラグをさせるお勧めしません

4. Order (P_ID, Package_ID) 

で注文をし、あなたが取得しようとすると、あなたのJOIN句が不必要に複雑になるだろうので、それは、取得する必要のある「パッケージ」の表を決定すべての注文のパッケージ詳細。

私は、単一ビット(個人的な好み)のための非正規化のビットを受け入れるだろうが限り正規として、あなたはまた、別のテーブルにパッケージP_TYPEを破る可能性が厳格になりたい場合は。ただし、パッケージに固有の他のフィールドがある場合は、IDとその他のフィールドを持つパッケージテーブルを作成し、商品IDとパッケージIDのリストを含むpackages_detailsテーブルを作成します。 また、は、カスタムパッケージとデフォルトパッケージ(つまりデフォルトパッケージは1〜100で、カスタムはそれ以降に始まります)の数値スキームを使用しないようにします。そのようなスキームは将来的に破損する可能性が高いためです

私が示唆するものは、すべての注文のすべてのパッケージの詳細を取得するためのクエリをまとめたもので、これはおそらく "最も詳細な情報"を表します。両方のデザインを使用してクエリを作成してみてください...

+0

私は両方のパッケージのために単一のテーブルを使うことは私の最初の計画であったことを認めなければなりません。しかし、カスタマイズされた共通のパッケージタイプに対して複数の注文を出す可能性があることを認識したときに、その計画を廃止しなければなりませんでした。パッケージテーブルからorder_Id外部キーを出すと、注文とカスタムパッケージ間のリンクが解除されます。複数のユーザーがパッケージ3を注文してカスタマイズすると仮定すると、3つのカスタム注文のうちのどれがカスタムパッケージ3つに関連付けられているかを特定する方法はありません。 – captainspi

+0

ユーザーがカスタムパッケージを注文すると、独自のIDをテーブルに取得する必要があります。私がデフォルトのパッケージタイプ(商品とパッケージのリスト)を注文すれば、それをカスタムパッケージなしでどうやって違うものにすることができますか? – Sparky

+0

ああ、私はあなたが意味するものを見ていると思う。パッケージテーブルにカスタムパッケージの新しいレコードを入力し、カスタムパッケージとカスタムパッケージIDを関連付ける必要があります。それは直感的な意味を持ちます。私はそれを見落としたとは信じられません。ありがとうSparky :) PS奇妙な理由から、私はカスタムパッケージの新しいインスタンスをパッケージテーブルに追加することなく、カスタムパッケージをプライマリパッケージIDに関連付けようとしていました。私は脳が退色したと思った。どうもありがとうございます! – captainspi

関連する問題