2012-05-08 5 views
0

私は注文を追跡する注文システムを作成しています。それぞれ約60の製品があり、それぞれに独自の価格が設定されています。システムはそれほど複雑ではありませんが、各製品がどれだけ多く注文したかを提出できるだけです。MySQL - さらにテーブルを分割しますか?

私の質問は、たとえば、...、である各製品を表す列で、「受注」テーブルを持っていることが、より効率的であり、彼らが注文した各の何を表す数値:

orders 
    id 
    product_a 
    product_b 
    product_c 
    etc... 

OR

私はそれを多対多テーブルに分割して別のテーブルに分割する必要があります。次のようなものがあります。

customers 
    id 
    name 
    email 

orders 
    id 
    customer_id 

products 
    id 
    product 

orders_products 
    order_id 
    product_id 

答えて

0

今後の機能と拡張のために、常にビルドしてください。ここやそこのショートカットは、あなたが後で全体を再構築してリファクタリングする必要があるときにいつもあなたを噛み砕くように見えます。正規化を参照し、なぜリレーショナルDB内のすべての独立した要素を分離する必要があるのでしょうか。

私はしばしば「この方法が簡単なときに別のテーブルにするのはなぜですか?」と尋ねられます。そして、「ああ、このタイプのものは他にはありません。多対多を必要とする機能で、将来の機能を考慮しないことでコーナーにあなたを描いたことを認識していない。データ構造を理解していない人は、これを実現できない傾向があり、システム要件を指定することにかなり悪いです。これは、通常、DBが大きくなり始めたときに発生し、データのサブセットのみを参照できるようにすることを望んでいます。フラットDBとは、さまざまな欲求を処理するための列を追加することを意味しますが、多対多の結合表は数行のコードで行えます。

1

2番目のサンプルに表示されているように、これにより、アプリケーションのスケーラビリティが大幅に向上し、効率も向上します。

0

私は2番目の方法も使用します。あなたが言うようにDBがシンプルであれば、速度などの点で違いはないかもしれません。しかし、新しいアイデアを得てアプリケーションに追加する場合に、2番目の方法は、効率的で簡単に再利用/強化することができます。

0

1番目のケースでは、各製品の顧客に与えた価格と割引をどのように把握できますか?そして、あなたが今それを追跡する計画がない場合でも、これはかなり共通しているので、そのような変更を求めるかもしれません。

標準化されたスキーマでは、いくつかのフィールドを追加するだけです。

関連する問題