2015-09-11 84 views
1

我的數據庫設計有問題。我將瀏覽器作爲一個小型項目來幫助提高我對網站和數據庫設計的整體理解。
我當然不會在這裏發帖,如果我沒有試圖自己找到解決方案(這是搜索問題的其中一個問題,它發現其他問題,如「如何創建一個許多2多個表」 )多個表之間的多對多關係

現狀:
有它們都實現了數據庫建築/研究(以防止大量的硬編碼的)

CREATE TABLE IF NOT EXISTS `structType` (
`idStructType` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(30) NOT NULL, 
    `idRace` int(11) NOT NULL, 
    UNIQUE (name), 
    FOREIGN KEY (idRace) REFERENCES race(idRace), 
    PRIMARY KEY (idStructType) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

其中一些建築物和研究的過程中有一個科技樹。
這裏是我的問題開始的地方:一個結構可以有多個結構作爲需求以及多個研究。 它也是相反的:
研究也可以有建築/其他研究作爲要求。
於是我開始打造「多到多」 -resolving組像這樣的:

CREATE TABLE IF NOT EXISTS `structtypeReqStructtype` (
`idStructType` int(11) NOT NULL, 
`idStructType_required` int(11) NOT NULL, 
`level` int(11) NOT NULL, 
UNIQUE (idStructType, idStructType_required, level), 
FOREIGN KEY (idStructType) REFERENCES structType(idStructType), 
FOREIGN KEY (idStructType_required) REFERENCES structType(idStructType) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

這到底給我留下了4代表的結構和研究之間的科技樹,更不用說船舶防禦,這感覺對我來說是不好的設計。
幾乎不得不有更好的方法來做到這一點。我很樂意得到一些幫助,以便我應該採取思維過程。

回答

0

這是一個相當開放式的問題,但這裏有一些想法:

  • 你有研究的項目,建築和單位。所有這些都具有「我研究/建造」的能力(成本,時間)。
  • 你有一個先決條件的概念。你必須在建築單元Z之前完成研究X /建築Y.

我認爲最乾淨的設計可能是一個包含所有'可構建'(包括研究項目)的表。這可能只是成本,構建器(可建立表的鏈接),名稱和ID。

您可以在其上添加擴展表。你創建一個引用「可構建」的「結構」表,並添加任何額外字段的「結構」需求。

最後,你可以創建一個'先決條件'表。這有兩個可構建的ID,一個用於可修復的問題,一個用於所需的項目。現在,您不必爲structToResearch,structToStruct,researchToStruct和researchToResearch提供單獨的必需表。

TL:DR;做一個多對多關係有意義的基表。製作每個類型的特定表,這些表將外鍵保存到基表中。

+0

是的,當然這是答案(不「感覺」像壞的設計)謝謝你幫助我 –

相關問題