2011-01-19 78 views
6

我正忙於創建一個基本的電子商務網站,並想知道以下兩個選項中關於我存儲帳單和送貨地址的最佳方式。我願意接受任何其他建議。SQL表格設計:我應該將訂單地址存儲在單獨的表格中嗎?

我可以包含在訂單表中的賬單地址和送貨地址:

order 
------- 
billing_name 
billing_address 
billing_state 
shipping_name 
shipping_address 
shipping_state 

否則,我可以創建將只存儲地址的訂單另一個表:這取決於是否地址

order 
------- 
billing_address_id 
shipping_address_id 

order_address 
------- 
address_id 
name 
address 
state 
+1

對不起,我應該添加到我原來的問題。我想要做的是用另一個表來存儲客戶地址,這可能像地址簿一樣起作用,並且額外訂單地址表的目的是爲了能夠永久存儲爲訂單提供的地址,然後如果客戶決定要更新客戶地址表中的地址,它不會影響爲訂單提供的地址。這會對很多? – KSS 2011-01-19 20:26:29

回答

0

被重新使用。

如果您有一個「註冊客戶」表,那麼您一定要選擇「delivery_adress」,「billing_adress」等表格,它們的每個記錄都與客戶相關聯。

2

編輯:根據新的評論,你要從通訊錄複製到一個order_address表,它可能會讓你的訂單表更清潔,但如果你要複製數據無論如何,我會說它複製到它所屬的記錄。

-

兩種,非規範化的運輸,並保持他們的順序。存儲很便宜,而且比在地址表中管理一堆額外的數據要容易。但請保持地址分開,以便客戶不必再次輸入。如果你反規範化,那麼你不必在你的地址表中爲它們保留顯式記錄,並擔心軟刪除。

不要低估管理地址的複雜性。如果我在系統中輸入地址並將其與我的帳戶相關聯,然後意識到它的某些部分是錯誤的,那麼您需要刪除舊地址並創建一個新地址。刪除可以是軟刪除,但需要刪除。您可以嘗試確定是否要加入新地址,或者大幅改變舊地址。或者你只能允許添加和刪除地址。但是當操作發生在地址上時,先前的訂單需要首先維護分配給它的數據。編輯已經與訂單相關聯的地址,將在訂單發送之後修改訂單的地址。確保你仔細考慮這些情況。有幾種方法可以解決潛在的問題,但是您的決定實際上取決於您想如何處理這些情況。如果您在地址信息放置後非規範化並複製地址信息,那麼編輯地址表中的地址就不會成爲問題。決定如何處理這些情況,並且您的數據庫模式只需要支持這些。任何選擇都可以。

0

如果您計劃在您的網站註冊用戶,那麼包含結算和送貨地址標識的表格將更好地發揮作用,然後您可以將訂單放在其他表格中,然後使用您已擁有的標識關聯訂單信息< = >結算/送貨地址

1

第二種方法比第一種方法有幾個優點。簡單地說,地址是相同的,因爲它們通常會是這樣,而且錯誤的可能性較小。此外,如果您曾經在一個帳戶中儲存過地址,第二種方法會讓您更容易。也就是說,您需要驗證給定地址實際上屬於與訂單相同的帳戶,您可以通過在orderorder_address表中包含customer_id字段,然後在order_address的主關鍵字中包括customer_id以及外部鑰匙從orderorder_address

2

我會保留在一個單獨的表中的地址,並從訂單中引用它們。我將包含一個「CurrentAddress」屬性,以便最終用戶可以從當前地址列表中「刪除」該地址。該值仍然存在於表格中,以便以前的訂單可以參考地址以用於歷史目的,但是它不再是訂購時的可選地址。

2

將地址拉入單獨的表格會更規範化,但要小心。如果您允許更新地址,則可能會失去訂單最初計劃發貨/運送到的地方。

8

我通常會選擇第二個。這可以讓你爲不同類型的客戶提供許多不同的地址。但是我通常會首先在客戶層面解決這個問題,然後解決訂單和發票問題。

但是,您可能需要解決訂單工作流程/業務規則的性質。

訂單完成後,它是一個文件(如發票)?如果是這樣,那麼地址應該被鎖定在當時,並且不能被更改,否則您可能無法重新顯示原始文檔。

當用戶改變他們的帳單地址,是不是一箇舊秩序的帳單地址,甚至事情了?在這種情況下,帳單地址甚至不需要從訂單鏈接,而只需從客戶鏈接。如果您要重新提交付款訂單,您可以將它們顯示到當前的帳單地址。

+2

+1:我的感情完全不錯,希望我能再次升級。雖然規範化是我們爭取的,但它首先依賴於業務規則 - 因爲在規範化的設置中,更新地址會影響歷史記錄。 – 2011-01-19 20:29:17

+0

@OMG Ponies當更新多個東西鏈接的地址時,需要做出設計決定是要改變位置還是拆分地址,以及如果拆分,哪些行指向更改的地址。即使將所有更改記錄到審計表或其他內容中,仍然可能需要做出這些選擇。 – 2011-01-19 20:33:16

4

就個人而言,我既不喜歡你的解決方案雖然第二種解決方案是「點對點」,在數據庫理論方面。如果你有重複地址,你應該存儲一次。

問題出現在實施中。下訂單時,您需要決定是否要使用現有地址,更新現有地址(例如,使用新添加的公寓號)或創建新地址(客戶已移動,有一個新的夏季地址,無論如何)。

爲了做到這一點,有人(直接或電話銷售員工,客戶或在線銷售計劃)必須決定是否執行地址更新或地址添加操作。要讓用戶準確地做出這樣的決定是非常困難的。如果在真正需要添加時執行更新,則會損壞訂單歷史記錄(舊訂單指向新地址)。如果在更新是正確的選擇時執行添加,那麼您已經消除了規範化結構的值。

在這樣的情況下我來,不完全是令人高興的是,這樣的結論,最好的選擇是存儲一個或多個地址的客戶,然後在地址信息複製到訂單本身的地址字段。

如果您選擇第二個選項,您需要計劃編寫一個真的很好用戶界面到地址系統,以避免上面提到的那種問題。並且請記住,不僅是你,而且每個在將來從事項目工作的程序員都必須理解並同意該地址表的管理。

相關問題