2015-09-11 60 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

是的,当然这是答案(不“感觉”像坏的设计)谢谢你帮助我 –

相关问题