【问题标题】:Many to Many Relationship over multiple tables多个表上的多对多关系
【发布时间】:2015-09-11 14:19:10
【问题描述】:

我的数据库设计有问题。我正在制作一个浏览器游戏作为一个小项目,以帮助提高我对网站和数据库设计的整体理解。
当然,如果我自己不尝试找到解决方案,我就不会在这里发帖(这是搜索问题会发现其他问题的事情之一,例如“如何创建多 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 张桌子,只用于结构和研究之间的技术树,更不用说船只和防御了,这对我来说是个糟糕的设计。
几乎必须有更好的方法来做到这一点。很高兴能在我应该采取的思考过程中获得一点帮助。

【问题讨论】:

    标签: mysql database many-to-many relationship


    【解决方案1】:

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

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

    我认为最简洁的设计可能是包含所有“可构建”的表格,包括研究项目。这可能只是成本、构建器(指向可构建表的链接)、名称和 ID。

    您可以在此基础上添加扩展表。您制作了一个引用一个“可构建”的“结构”表,并添加了“结构”需要的任何额外字段。

    最后,您可以制作一个“先决条件”表。这有两个可构建 ID,一个用于有问题的可构建 ID,一个用于所需项目。现在您没有 structToResearch、structToStruct、researchToStruct 和 researchToResearch 的单独必需表。

    TL:DR; 制作一个有意义地应用多对多关系的基表。制作每个类型的特定表,这些表包含基表的外键。

    【讨论】:

    • 是的,这当然是答案(不会“感觉”像糟糕的设计)谢谢你帮助我
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多