多个表的多对多关系

时间:2015-09-11 14:19:11

标签: mysql database many-to-many relationship

我的数据库设计有问题。我正在制作一个浏览器游戏作为一个小项目,以帮助提高我对网站和数据库设计的整体理解 当然,如果我自己没有尝试找到解决方案,我就不会在这里发帖(这是搜索问题的其中一个问题,它会找到其他问题,例如"如何创建一个许多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;

其中一些建筑物和研究当然有技术树 这是我的问题开始的地方:结构可以有多个结构作为要求以及多个研究。 反过来也是如此:
研究也可以将建筑物/其他研究作为要求 所以我开始创建像这样的多对多" - 解决小组:

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张桌子,仅用于结构和研究之间的技术树,更不用说船只和防御了,对我来说感觉就像是糟糕的设计。
几乎必须有更好的方法来做到这一点。我很乐意在一个方向上获得一些帮助,我应该采取思考过程。

1 个答案:

答案 0 :(得分:0)

这是一个非常开放的问题,但这里有一些想法:

  • 您有研究项目,建筑物和单位。所有这些都具有被研究/构建的能力。我假设(成本,时间)。
  • 您有先决条件的概念。你必须在建造单位Z之前完成研究X /建筑Y.

我认为可能最干净的设计是包含所有可构建物品的表格,包括研究项目。这可能只是一个成本,一个构建器(一个指向buildables表的链接),一个名称和一个ID。

您可以在此基础上添加扩展程序表。你创造了一个“结构”。表格引用了一个可构建的',并添加了任何额外的字段'结构'需要。

最后,你可以制定一个先决条件'表。这有两个可构建的ID,一个用于可构建的ID,一个用于所需的项目。现在,您没有为structToResearch,structToStruct,researchToStruct和researchToResearch提供单独的必需表。

TL:DR; 创建一个多表关系有意义的基表。使每个类型特定的表保存基表的外键。