2009-01-07 63 views
4

在我的數據庫中,我目前有兩個表,除了一個字段幾乎相同。我應該將兩個相似的表合併爲一個嗎?

有關我的項目的快速說明,每年企業都會向我提供他們出售給的供應商列表,並且還會從中購買商品。由於這是每年完成的,因此我有一個名爲sales的表和一個名爲purchases的表。

所以在sales表,我將有領域,如:BusinessIDyearPurchaserID等,以及完全相反將在purchases表,除了會有SellerID

因此,除了PurchaserID/SellerID之外,基本上兩個表都是完全相同的字段。我繼承了這個系統,所以我沒有這樣設計數據庫。我在辯論將兩張桌子合併成一張名爲suppliers的表格,並且只是添加一個type字段以區分它們是銷售還是從中進行購買。

這聽起來像個好主意嗎?有沒有什麼我不知道爲什麼這不是一個好主意?

回答

2

標準化會說「是」。

有多少應用程序受此更改影響?這會影響決定。

+0

只有一個應用程序 – Joe 2009-01-07 18:27:47

+0

優秀。對單個表格的更改將如何擴展?它是用你熟悉的語言寫成的嗎?你可以更改應用程序嗎?迴歸測試有多難? – duffymo 2009-01-07 18:29:18

2

絕對是一張表。我不會把它稱爲供應商,因爲這並不反映表的含義。像busibess_partner或更好的東西可能會更合適。而不是purchase_id和seller_id,那麼應該比business_partner_id更通用,是的,添加一個字段來區分。

7

做什麼適合你。

教科書的答案是normalize。如果你規範化你可能會有兩張桌子,其中一個與你的買家和賣家作爲公司。還有一個交易表,告訴誰從誰那裏買了什麼。

4

如果它沒有損壞,請不要修復它。讓他們分開。

由於系統已經建好,所以如果你發現自己在兩個表中做了很多查詢,比如討厭的UNION查詢,我只會考慮這個。在一個表格中加入兩個表格會讓查詢變得更容易,比如「向我展示在這些日期之間出售/購買的所有賣家或買家......」。

但是這聽起來像這兩個組的處理方式與業務規則角度截然不同,所以在這一點上它可能不值得麻煩地進行應用程序更改。 (每個查詢都必須有一個「WHERE Type = 1」或類似的東西)。

如果你在數據庫設計階段已經問過這個問題,我的答案可能會有所不同。

0

您必須考慮到兩個表上的記錄數。如果它們的規模很大,它可能會對與客戶和供應商有多個聯合的查詢產生巨大的衝擊。

例如:誰向我們出售電腦,我們向誰出售電腦。

+0

您認爲有多大「太大」? – duffymo 2009-01-07 18:31:25

2

沒有一張桌子。它們是具有相似結構的不同實體。鞏固它們沒有什麼可以獲得的。 (沒有任何損失,除了清晰度;但這是關鍵恕我直言)。

「規範化」不包括查找具有相似模式的表並將其合併。

1

數據庫始終是您業務目標的有限模型。如果它對你的業務沒有意義,那麼應該忽略那些說你應該通過創建一個新的公司表來增加複雜性的那些人(儘管你可能已經有類似的東西了)。如果你真的想進入「完美模型」遊戲,只需將所有內容抽象成一個「實體」表,並且很快你就會擁有一個完全無法管理的數據庫。

規範化將決定不組合兩個字段,除非外鍵實際指向同一個表。要記住的關鍵規則是表格中的每一列只應該指一件事。添加第二個字段,解釋第一個字段意味着什麼違反了這條規則。

如果由於您總是加入兩張表而導致您的查詢變得混亂,您可以創建一個視圖。

此外,表中的記錄數幾乎完全不相關。完成系統後,始終對性能進行優化。如果它將一個表中的所有記錄都殺死到您的應用程序中,請在以有意義的方式對您的表進行分區的列上設置聚簇索引。

0

從完全不同的角度。我傾向於將技術視爲邏輯。對我而言,決定不是數據在形狀或領域上是否相似,而是它們是否合理混合。這同樣可以說是否技術答案可能是正常化,我的答案是:對你來說(商業邏輯)是否合理?

另一個答案是關於合併和改變命名約定。對我而言,這是一個邏輯決策:你說你不是與買賣雙方合作,而是與商業夥伴合作。如果這是你的情況,那就去做吧。

您可能還會考慮您對錶格的使用。如果他們是一種獨特的邏輯類型(商業夥伴),那麼您肯定會有需要訪問買方和賣方的查詢。否則,如果你所有的疑問都是分開的,那可能表明它們不是一樣的,也不應該在一起。將它們推到一起意味着需要花費大量額外的檢查和CPU時間,這與獨立實體不同。

在這裏可能適用的接口有一個長期使用的隱喻。除非你喜歡玩俄羅斯輪盤賭遊戲,否則就是因爲消防槍和照相機都在拍攝,這並不意味着它們共享一個界面。

0

從邏輯的角度來看,報告的交易似乎沒有區別,只是在向誰報告這些交易方面存在差異。它應該是一個帶有SellerID,BuyerID和(如果你需要的話)ReporterID(也許是附加的交易信息)的單一表格。

這就是它如何應該是。現在,如何進行轉換?使用這兩個舊錶格填充新表格的腳本應該是一個簡單的練習,但是您還需要更改所有使用該信息的查詢。這可能是很多工作,可能不值得。

-1

由於沒有一個專家報告中都願意回答你的問題,簡單的答案是:QUERY1 UNION QUERY2

EX。 SELECT * FROM table1 UNION SELECT * FROM table2假設table1和table2具有相同的結構/標題標題

相關問題