2017-03-06 168 views
0

我發現下面的情況,我不知道我是否以正確的方式處理。所以我的DB模式:數據庫設計中的外鍵 - 數據庫設計

enter image description here

該模式包含有關給定服務器上運行的產品數據。服務器可以在多個客戶之間共享。 Table ProductServer告訴我們給定的產品已經安裝在給定的服務器上。

由於產品/服務器的組合可以被多個客戶使用(服務器可以有多個客戶),所以我創建了另一個表Instance,它包含ProductServer行的其他信息。它包含有關哪個客戶使用該產品及其優先級的信息。

我沒有使用任何持久性框架,所以我手動編寫了所有抓取函數。

我的問題是:目前我有查詢時,連接所有表:

SELECT * FROM ProductServer ps 
LEFT OUTER JOIN Product p ON ps.product_id = p.product_id 
LEFT OUTER JOIN Server s ON ps.server_id = s.server_id 
LEFT OUTER JOIN ServerCustomer sc ON s.server_id = sc.server_id 
**LEFT OUTER JOIN Customer c ON sc.customer_id = c.customer_id** 
LEFT OUTER JOIN Instance i ON ps.ps_id = i.ps_id 
**LEFT OUTER JOIN Customer c2 ON i.customer_id = c2.customer_id** 

在我的SQL,你可以看到標有**行,我不得不參加一個表兩次在一個查詢,我不完全確定,但我覺得這可能是糟糕的想法/糟糕的數據庫設計。

我有一個想法將產品服務器和實例拆分爲一個表,但由於ProductServer表可能有100k行,所以我認爲將表更好地拆分爲兩個較小的表。

請你能告訴我,這是否設計得不好,並轉發給一些來源,我可以找出如何更好地實施這個問題?

編輯: 我需要獲取所有客戶給服務器,因爲我需要獲取所有數據到Java object`s。這就是爲什麼我需要表Customer與ServerCustomer加入,並且在一個數據庫查詢中也加入了Customer與Instance表。

回答

0

你可能想要做的是重新安排你的連接,只加入Customer一次。不完全清楚您的當前條件是否應合併ANDOR。我和AND怎麼回事:

SELECT * FROM ProductServer ps 
LEFT OUTER JOIN Product p ON ps.product_id = p.product_id 
LEFT OUTER JOIN Server s ON ps.server_id = s.server_id 
LEFT OUTER JOIN ServerCustomer sc ON s.server_id = sc.server_id 
LEFT OUTER JOIN Instance i ON ps.ps_id = i.ps_id 
LEFT OUTER JOIN Customer c ON sc.customer_id = c.customer_id 
          AND i.customer_id = c.customer_id 

你可以做到這一點,因爲連接並不限於兩個表之間的必然 - 他們可能本身已經是結果的其它連接的表源之間。因此,在上文中,當我們到達最後的ON子句時,我們將在左邊加入{ProductServer, Server, ServerCustomer, Instance}到右邊的{Customer},我們可以引用任何這些表中的任何列作爲加入條件的一部分。

+0

我之所以做這兩個連接的原因是因爲我使用此查詢將所有這些數據提取到Java對象中。 所以我需要所有的客戶對象在服務器對象中,並且我還需要在實例對象中有客戶對象。 – n0hepe