2011-07-23 11 views
0

私はちょうど私のデザインに、次の二つのアプローチを見て、それが第二のアプローチを取ることを支払う場合だけ思ったんだけど、データベース設計、 に新たなんです。しかし、私はそれが冗長なテーブルを作っていると思った。これに関する提案はありますか?データベース設計

最初のアプローチ:

顧客テーブル
-------------------------------- -
CUSTOMER_ID - 主キー
----------------------------------
タイトル
FIRST_NAME
LAST_NAME
cell_number
ADDRESS_LINE1
ADDRESS_LINE2

ZIP_CODE

------------------------------ -

第二のアプローチ:

顧客テーブル
---------------------------------
customer_id - プライマリキー
------ ---------------------------
タイトル
first_nameの
last_nameの
cell_number
------- --------------------------

カスタマーアドレステーブル
--------------------------------
ADDRESS_ID - 主キー
------ --------------------------
CUSTOMER_ID - 外部キー
ADDRESS_LINE1
ADDRESS_LINE2

ZIP_CODE

---------------------------------

* 編集:各ユーザーがデータベース内の唯一の1のアドレスを持つことが許されます。

+1

お客様が複数の住所(#2)を持つことができる場合は、住所の種類(自宅、仕事、プライマリ、優先など)を指定することができます。 – JeffO

答えて

0

主な質問は、顧客が複数の住所を持つことができるかどうかです。

お客様に複数の住所がある場合は、2番目のデザインが適切です。

各顧客は1つのアドレスのみを持っている場合は、あなたが最初のものを使用する必要があり、いくつかの理由で :

  1. それは簡単です、それはとき
  2. 外部キーは、オーバーヘッド作成物事をシンプルに保つために常に最善ですDBエンジンは、顧客IDが存在するかどうかを調べるために、最初のテーブルの主キーのすべての行をチェックする必要があるため、INSERTを使用します。
  3. 特定のクエリにはJOINを使用する必要があります。

第2の設計のもう一つの利点は、それが、これはDBエンジンがインデックスこの列は、SELECTクエリが より速く行くことを引き起こしますことを意味し、アドレスフィールドにPRIMARY KEY、 を持っているということである、しかし、あなたもこのインデックスを作成することができます最初のデザインで。

したがって、顧客ごとに複数の住所がある場合は、全体的に2番目のデザインが必要になります。

+0

各ユーザーは1つのアドレスしか許可されていません。どのようにして最初のデザインでインデックスを作成できますか? –

+0

基本的なSQL構文は 'CREATE INDEX index_name ON table_name(column_name)'です。さらに多くのオプションがあります。g for MySQLこのページをチェックしてください:http://dev.mysql.com/doc/refman/5.0/en/create-index.html、たくさんの運があります:)(念頭に置いて、インデックスはSELECT文を作る利点があります速くなりますが、DBへの変更は遅くなります) – fiftyeight

1

2つ目の方法は、1人のユーザーがデータベースに複数のアドレスを一度に持つことを許可する場合にのみ有益ですが、これは当てはまりません。

1

あなたはNormalization Forms

をチェックする必要があります次に、あなたの質問のすべてが終了します:)

1

を使用すると、1つの以上のオフィスを持っているすべての企業を知っていますか? 顧客として使用する場合は、2番目の方法を使用してください。

1

アドレス情報を検索するときに結合クエリを実行する必要がないため、最初の方法が高速になります。

ユーザーに複数のアドレスを許可すると、2番目の方法が適切です。自問する

+0

+1は悪く見えるため+1です。 :-) –

1

もの:

  • 私は全体の顧客レコードを更新する(そしておそらく顧客ID変更)顧客が移動した場合にしたいですか?
  • お客様が移動した場合は、以前の住所を把握しますか?
  • お客様に複数の配達先住所がありますか?

これはあなたの質問に答えるのに役立ちます。

0

お客様は、請求先住所と配送先住所が別々の場合があります。私は使用しました:

... 
billing.address_line1 
billing.address_line2 
... 
shipping.address_line1 
shipping.address_line2 
... 

配送先住所がNULLの場合は、請求先住所を使用してください。