2014-09-24 81 views
-1

我有一些數據庫性能問題(還不是真正的問題,但我想確保一切都足夠好)。數據庫性能問題 - 重複數據

我有大約10個連接的表。有一個主對象/表是所有的「母親」,並且包含用戶ID(這些記錄是用戶特定的)。所以,如果我想從特定用戶的任何表中獲取任何記錄,那麼我必須說5個以上的聯接。

我決定避免連接的複雜性,所以我將這個用戶ID添加到所有表中。現在,如果我想從特定用戶的特定表中獲取記錄,我不需要任何連接。

這會導致任何問題,是不好的做法是我的問題。

用於應用程序和數據庫的Microsoft技術。

+0

[DATABASE NORMALIZATION](http://en.wikipedia.org/wiki/Database_normalization) – Kermit 2014-09-24 21:22:30

回答

2

有點難以說不理解你的連接結構。我從你的問題中得知,你有一個類似於如下表的層次結構: Customers - > Invoices - > Orders - > OrderItems,(其中 - > = 1到很多),問題是將sy,customer ID包含在OrderItems表,因爲如果沒有它,爲了確定某個特定訂單項的customerID,您必須遍歷該鏈以獲取訂單,然後使用Invoice來獲取客戶ID(將該CustomerID作爲Customers和Invoices之間的連接列)。

答案可能是「取決於」。如果你是純粹的,你可能會避免這種情況,但是如果你經常發現你有一個OrderItem記錄,但是你沒有把invoiceID放在手裏。你需要從客戶表中找到「客戶地址」,然後或許值得。

要考慮的事情是關係是否是不穩定的,例如,無論是否說,發票可以從一個客戶轉移到另一個客戶,或者可以將訂單從一張發票轉移到另一張發票。如果是這種情況,那麼您將不得不記住不僅要更改發票中的customerID,還要更改該發票上所有訂單上的customerID以及每個訂單中的所有訂單項。如果你採取完全標準化的方法,你只需要進行1次更新。如果不是這樣,你可以對很多不同的表進行很多寫操作,具體取決於你進入層次結構的深度以及你的數據庫中有多少記錄。如果你已經灑​​滿了客戶ID,那麼可能會寫很多東西,並且讓所有內容保持同步可能會讓人感到痛苦。

如果那些正在編寫針對你的db代碼的人並不真正瞭解你所做的事情,它可能會變成一團血腥的混亂,我認爲這就是爲什麼人們會避免它。

我會說這是實際的。您多久會發現需要遍歷層次結構才能執行您想要執行的操作,以及您正在複製的外鍵是否可能發生更改。

+0

您瞭解我的問題和正確的層次類型。謝謝你的回答,這就是我期待的! – Ryjel 2014-09-25 10:31:31