我發現下面的情況,我不知道我是否以正確的方式處理。所以我的DB模式:數據庫設計中的外鍵 - 數據庫設計
該模式包含有關給定服務器上運行的產品數據。服務器可以在多個客戶之間共享。 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表。
我之所以做這兩個連接的原因是因爲我使用此查詢將所有這些數據提取到Java對象中。 所以我需要所有的客戶對象在服務器對象中,並且我還需要在實例對象中有客戶對象。 – n0hepe