2011-07-23 223 views
0

我新的數據庫設計, 我只是在看下面的兩種方法我的設計,只是想知道,如果它支付採取第二種方式。但我再次認爲這只是製作一張冗餘表格。對此有何建議?數據庫設計

第一種方法:

客戶表
-------------------------------- -
CUSTOMER_ID - 主鍵
----------------------------------
稱號
FIRST_NAME
姓氏
cell_number
ADDRESS_LINE1
ADDRESS_LINE2
城市
ZIP_CODE
國家
------------------------------ -

第二種方法:

客戶表
---------------------------------
customer_id - 主鍵
------ ---------------------------
標題
FIRST_NAME
姓氏
cell_number
------- --------------------------

客戶地址表
--------------------------------
address_id - 主鍵
------ --------------------------
CUSTOMER_ID - 外鍵
ADDRESS_LINE1
ADDRESS_LINE2
城市
ZIP_CODE
國家
---------------------------------

* 編輯:每個用戶被允許在數據庫中只有1個地址。

+1

如果客戶可以有多個地址(#2),您可能需要指出地址類型:家庭,工作,小學,首選等。 – JeffO

回答

0

主要問題是客戶是否可以擁有多個地址。

如果客戶有多個地址,第二種設計將是適當的。

如果每個客戶只有一個地址,你應該使用有以下幾個原因第一位的, :

  1. 它更簡單,它總是最好讓事情變得簡單
  2. 外鍵的開銷,當你創建使用INSERT,因爲數據庫引擎必須檢查第一個表的主鍵的所有行,以查看是否存在客戶ID。
  3. 您必須對某些查詢使用JOIN。

第二設計的另一個優點是,它具有對地址字段PRIMARY KEY, 這意味着數據庫引擎將索引此列導致SELECT查詢去 更快,但是你也可以創建這個索引在第一個設計上。

因此,總體而言,僅當您爲每位客戶提供多個地址時才需要進行第二種設計。

+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,很多運氣:)(PS記住,索引具有製作SELECT語句的優勢走得更快,但對數據庫的更改會更慢) – fiftyeight

1

第二種方法是隻對你有利,如果你允許一個用戶在你的數據庫有多個地址同時,這我假設不是這樣的,所以你應該與第一種方法去。

1

你知道嗎,有超過一個辦公室的任何公司? 如果您打算讓他們成爲客戶,請使用第二種方法。

1

第一種方法會更快,因爲查找地址信息時不需要執行連接查詢。

如果您允許用戶有多個地址,第二種方法將是適當的。

+0

+1因爲-1看起來不好。 :-) –

1

事情要問自己:

  • 做我想做的,如果客戶移動到更新整個客戶記錄(以及可能改變客戶ID)?
  • 如果你的客戶移動了,你想跟蹤他們以前的地址嗎?
  • 您的客戶是否有多個送貨地址?

這應該有助於回答你的問題。

0

客戶也可能有單獨的帳單和送貨地址。我用過:

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

如果送貨地址爲NULL,則使用帳單地址。