2013-10-10 21 views
3

假設,如果我是與該跟蹤產品和跨多個表順序信息(訂單,ORDER_ITEMS,產品)保持與恆定的編輯順序的數據完整性

orders 
    id    INT(11) 
    shipping_name VARCHAR(255) 
    shipping_street VARCHAR(255) 
    shipping_city VARCHAR(255) 
    [etc] 

order_details 
    id    INT(11) 
    order_id  INT(11) 
    product_id  INT(11) 

products 
    id    INT(11) 
    name   VARCHAR(255) 
    description  VARCHAR(255) 
    price   DECIMAL(8,2) 

結構非常簡單order具有多個系統order_items,order_items有一個product

問題是,當有人編輯產品時,這些編輯會修改以前訂單的數據。如果員工稍後返回並查看該信息,則他們可能沒有與訂單發出時客戶收到的信息相同的信息。

什麼是最佳實踐? 我應該爲產品表添加一個'display_item'字段,並在編輯/刪除設置顯示爲0並添加編輯的產品爲新行? 我應該在order_details中複製名稱,描述和價格嗎?

+0

看看[這篇文章](http://stackoverflow.com/a/11930467/533120)。 –

回答

0

我認爲這是數據庫正常化「中斷」的情況之一。

一些可能的解決方案:

  1. 保持產品的副本屬性,每個訂單。這在存儲方面很昂貴,但它更容易追蹤訂單中存儲的產品數據。
  2. 創建可以及時更改的屬性日誌。產品屬性可能隨時間而改變,因此存儲修改日期的日誌可以幫助您在訂單生成時過濾出產品屬性。

提案選項1

創建products表的副本和每個訂單順序詳細創建的關係(一對的一個)到order_details表。

提案選項2

斯普利特products表二:product_general_infoproduct_attributes。產品綜合信息的目的是保持穩定(一個產品的一般信息不會改變),因爲對這個表中的數據的任何修改都會傳播到整個訂單集。產品屬性必須具有datetimestamp值來定義屬性更改的時間。然後,您可以查詢數據庫並返回訂單日期之前或之後的最後一條記錄。