2010-11-02 159 views
0

的目的複製列我有以下表格:數據庫設計 - 報告

Product(ProductID, ProductName ...) 
ProductBidHistory(ProductID, UserID, Amount, Status, ...) 

的BidHistory表可以長到有許多記錄每一件產品,我想包含每一件產品即批准申辦報告狀態=批准的金額。

  • 是否可以在產品表格本身中有一個ApprovedAmount列,當出價關閉時填充此列以便報告更容易。
  • 是否應編寫報告以便與歷史記錄表進行連接以查找「批准」並獲取金額。

可以複製列嗎?

+0

來澄清,如果產品:BidHistory == 1:多的關係,那麼列將如何足夠? BidHistory對於A產品是否只有1個status = APPROVED行? – InSane 2010-11-02 11:00:48

回答

2

從純粹的設計角度來看,您不應該保留相同數據的兩個副本。這可能會導致數據不一致。如果批准金額和出價記錄不一致怎麼辦?

從性能角度來看,您可能會複製數據以獲得生成報告的速度。

從應用程序的角度來看,開發人員必須確保每次更新「出價歷史記錄」表格時,都會對產品表格中的批准金額進行適當的更新。

+1

從性能角度看:使用實現(SQLServer上的索引視圖或Oracle上的物化視圖)。除此之外:+1的帖子。設計視角是最重要的。 – Falcon 2010-11-02 11:05:46

+0

另外,如果您選擇非規範化,確保數據保持一致的唯一方法是使用觸發器。依靠這樣做的應用程序是一個大錯誤。 – HLGEM 2010-11-03 15:27:37

0

這實際上取決於這些表的大小。

如果它們不是很大,我會建議你不要複製列,因爲這會在應用程序層造成更多的開銷。一個簡單的視圖或用戶定義的表函數應該足夠好。還要確保你在正確的列上有索引。

但是,如果表格將會非常大(數百萬行),那麼通過存儲用於報告目的的值,您可能會看到性能提升。

0

通常,您不應該複製關係數據庫中的列,以便根據表示(有效)查詢的方式獲取不會彼此混淆的答案。

已批准不是產品的屬性,而是出價的屬性,您應該始終嘗試讓數據庫結構反映真實世界的本體。

當然,如果該表中的行沒有引用某人擁有的特定產品(例如iPad 16G S/N 123456789),但是不能將產品表中批准的是/否(布爾)列放入一個通用的「產品目錄描述」產品(例如iPad 16G),並可能出現在多個拍賣中。爲了提出問題,您的簡化設計不清楚。

在您的查詢中,您永遠不會僅僅詢問「所有已批准的出價」而沒有其他限定符。術語「批准=真」將總是與其他一些術語聯繫在一起,例如, (a,b,c)中的產品類別(可能是指數的候選列)中的出價日期,或產品id =?或產品類別。因此,明智地使用索引,不要違反規範化規則,使本體保持真實,並且數據庫將照顧你。