2009-02-19 125 views
1

我試圖設計一個服務器和數據庫庫存的數據庫,我正在尋找一個好的數據庫設計。我們有服務器集羣,獨立服務器和數據庫的表格。我想在數據庫中表示以下關係:數據庫設計問題

從羣集到服務器的一對多關係。
從數據庫到集羣/服務器的一對多關係。

困難在於第二種關係,因爲集羣和服務器位於不同的表中,並且集羣由服務器組成。代表這種關係的最佳方式是什麼?

+0

這對我來說不是很清楚。這聽起來像是一個巨大的磨合句。 – 2009-02-19 13:38:00

+0

我改寫了這個問題以提高清晰度。 – macleojw 2009-02-19 13:47:12

回答

3

這聽起來像你有這樣的局面你的關係視圖。

Cluster : name, other attributes of cluster 

Server : name, optional FK to cluster, other attributes of a server 

Database : name, (FK to cluster OR FK to server) 

問題是,你有一個更復雜的現實世界的情況,一個關係型技術不能很好地反映。

Host -- an abstract superclass for places a database can run. 

Cluster (extends Host) : name, etc. 

Server (extends Host) : name, optional FK to cluster. 

Database : FK to Host 

你必須處理這樣的「子實體」問題的幾種選擇。

  1. 將主機,羣集和服務器摺疊到一個表中。這導致主機(作爲羣集)和主機(作爲服務器)之間的遞歸關係。這有點令人討厭,但它確實爲主機,羣集和服務器創建了一張表。結果表中有很多空值(Cluster行使用一堆列,Server行使用不同的一組列)。必須添加一列來區分Host的子實體。

  2. 將主機信息向下推入羣集和服務器。當Host表中有許多公共信息時,這很有用,而Cluster或Server表中的子類特定信息很少。羣集和服務器表看起來非常相似(基本上是主機的克隆),並且有幾個不同的列。

  3. 根據主機中的鑑別器在(主機和羣集)或(主機和服務器)之間使用連接。儘管相當複雜,但是這樣可以很好地擴展,因爲所有數據庫都連接到一個主機,並且完整的主機列表是一個主機聯合,它們連接到服務器和連接到羣集的主機。

  4. 在數據庫中使用可選的FK字段。這要求數據庫加入到Cluster plus數據庫並加入服務器以獲得完整的數據庫列表。每個數據庫可能必須有一個鑑別器,以便您可以在兩個FK字段中區分NULL值的各種組合。有四種可能的組合,其中兩種是合理的,兩種可能會被禁止。試圖簡單地使用兩個可空的FK通常不能很好地工作,所以你通常需要一個狀態標誌來將Cluster上的Database從Server上的數據庫中分離出來,而不是分配給任何內容的數據庫,相關。

-2

選項1:在數據庫表中有兩個字段。一個是指服務器,另一個是集羣。保持其中一個爲空。

選項2:另一種方法是在羣集中爲每個獨立服務器添加一個條目,並僅鏈接到該表。

選項1是真的不乾淨的解決方案(我不同意上司的評價),所以要爲選項2 :)

+0

否否否。這是一個可怕的想法。 – cletus 2009-02-19 13:49:51