2012-08-13 192 views
0

在用戶可以下訂單的數據庫中,最好是有一個帶地址的新表,或者每個訂單在其標題中都有地址數據。數據庫優化訂單

+0

你正在使用哪種數據庫? – c0deNinja 2012-08-13 00:56:16

+0

postgres sql db – 2012-08-13 00:57:44

回答

5

這不僅僅是用戶(和它們的地址),但也對價格和你正在銷售,可以訂單後更改產品的其他信息被放置,然而爲了本身必須保持不變。

一般來說,有2種方法是:您在訂單(及其項目)需要

  1. 複製的一切。即使「主」數據發生更改,您仍然可以在可以使用的訂單內有副本。
  2. 「版本」或「歷史」整個數據庫,類似於this

(1)是更「實用」的方法,但可能會導致數據的冗餘(例如,當地址變化,你仍然使得它的單獨副本)。 (2)是更純粹的方法,但可能需要更多的JOIN,並且通常會更復雜。

0

我想不出任何地址與訂單在同一個表格中的原因,只不過它現在爲您節省了少量的工作。

論點有一個單獨的表包括:

  • 能夠與一個用戶的多個送貨地址,而不必通過所有訂單搜索(關聯,所以很容易向用戶提供地址的下拉列表他們以前使用過)。

  • 您可以使用相同的表計費和送貨地址,避免重複

  • 可以延長/更改地址是如何存儲在未來的(例如,通過增加一個國家外地當你去國際),而不必更新每個訂單。

這些都與優化無關。不知道爲什麼這是標題?

[Branko在保存訂單數據方面有一個很好的觀點。但是,您不需要使數據庫完全版本化。您可以簡單地在從訂單引用的事物(如用戶和地址)上擁有「過期」標誌,但不再具有當前值。換句話說,你只需要兩個「版本」 - 當前和歷史。只要您在訂單表中顯式引用參考資料(因此您不需要通過用戶訪問交付地址,而是直接鏈接到訂單表中的地址表,可以使其工作。完全版本化數據庫,包括關係,是很多工作]

+0

由於地址是真正的時間點數據;也就是說,這是訂單發貨的記錄,將發貨地址存儲在具有1對1關係的單獨表格中的優點是什麼?此外,爲什麼有一個過期的領域,當你只是查詢,看看訂單是否發貨?如果您以這種方式設計,您需要額外的觸發器或其他東西來確保您的「過期」標誌與訂單狀態保持一致。總的來說,我認爲這會產生比解決問題更多的問題。 – 2014-06-16 03:20:27

5

一般來說,你將最有可能要分開。

  • 用戶
  • 地址
  • 訂貨信息

這是因爲用戶可以隨時間改變地址,但是舊地址需要保留,因爲他們有對他們的命令。另外,單個用戶可以從同一地址獲得多個訂單,因此我們將這些信息分開以減少重複。

http://en.wikipedia.org/wiki/Database_normalization

0

不要重新發明輪子。訂單系統已經存在很多年了,最佳實踐已經確立。您可以創建一個地址簿,以便您的聯繫人可以有多個地址。聯繫人具有零對多地址。但是,在發貨時,請將訂單地址副本(或貨運實體)保留下來。將地址作爲時間點數據存儲以保持準確的歷史數據很重要。 Magento,Shopify,Quickbooks所有主要的會計和電子商務系統都有這樣的模型。 Saasu會計是一個例外。他們不會堅持地址與訂單,所以你必須爲每個訂單創建一個新的聯繫人,否則如果你修改了一個客戶地址,你最終會重寫歷史訂單上的地址。一個非常可怕的設計!