產品表:
- 這表應該是在自然 '過渡'。這意味着它可以隨時間變化而變化。
- 2011年,您可能以15.99美元的價格銷售產品A,但2012年您希望以16.99美元的價格銷售相同的產品,因此您希望自己的桌子足夠靈活適應這種類型的變化。
- 儘管存儲在此表中的數據具有靈活性,但是如果您曾刪除產品,則必須小心。如果您刪除某個產品,它將銷售銷售表中的任何匹配銷售交易或刪除它們(取決於FK行爲)。
銷售表:
- 這表應該是在自然 '交易'。意思是一行代表與銷售相關的產品,並在時間上凍結。
- 如果買方A在2011年以15.99美元的價格購買了產品A,您希望按原樣記錄此交易,在任何時間點都沒有任何數據變化,它反映了交易。
- 如果買方B在2012年購買了相同的產品A但售價爲19.99美元,則您希望將其記錄爲單獨的交易。確定它是同一個產品,但這一行代表一個新的交易。
通過以上的設置,您可以更改價格,您認爲合適的product
表,但它不會影響到已經發生的記錄在sales_transaction
表銷售。
僞模式:
product
:
- ID INT(11)無符號NOT NULL AUTO_INCREMENT
- 名VARCHAR(255)
- 價格小數(14.2)
- 主鍵( ID)
- 唯一密鑰(名稱)
sales_transaction
:
- ID INT(11)無符號NOT NULL AUTO_INCREMENT
- 的product_id INT(11)無符號NOT NULL
- PROVIDER_ID INT(11)無符號NOT NULL
- 價格小數(14.2 )
- created_at datetime默認'0000-00-00 00:00:00'
- 外鍵(product_id)在產品('id')上刪除casca德
- 外鍵(PROVIDER_ID)引用上刪除級聯
provider
提供商( 'ID'):
- ID INT(11)無符號NOT NULL
- 名VARCHAR(255)未空
- 主鍵(ID)
- 唯一的密鑰(名稱)
現在,您可以根據您在問題中的要求運行查詢,以獲取任何提供商的任何日期的任意產品的總和。
示例查詢:
# On Jan 5, 2011, Provider A makes $500 total off of its products
SELECT prov.*, SUM(sales.price)
FROM
provider AS prov
INNER JOIN
sales_transaction AS sales on sales.provider_id = prov.id
WHERE
provider.name = 'Provider A'
AND
sales.created_at BETWEEN '2012-01-05 00:00:00' AND '2012-01-05 23:59:59'
GROUP BY
prov.id
提供的模式在本質上是骨骼,所以隨時爲您的業務需求決定增加一列,但它應該讓你在正確的方向前進。
另外,最後一條建議,我會建議將您的日期時間存儲在UTC。如果您選擇在當地時區存儲,則如果您進行需要從當地時區進行轉換的銷售,則會遇到任何令人頭痛的問題。
你能解釋一下start_date是什麼嗎? SALES表格日期是指示當天已售出物品的值嗎? – 2012-01-07 01:34:42