0

我正在用 Symfony/Doctrine 制作游戏。我有两个表“模型”,它代表一个 3D 模型,和“纹理”,一个可以应用于每个模型的纹理列表。它们之间存在一对多的关系(一个模型有很多纹理)。

现在有一堆其他实体(怪物、角色、道具等)需要具有纹理和模型信息。我需要建立一个关系说“这个怪物有这个模型和这个纹理”(但由于模型和纹理本身是相关的,我不能使用带有地精纹理的龙模型 - 它必须是一个有效的对.)

问题是我觉得同时拥有 ->model 和 ->texture 属性是多余的,因为一个可以由另一个计算。没有数据库层检查纹理 A 是否与模型 B 实际匹配。

我最初以为我只会有 ->getTexture(),并创建一个“假”模型 getter,如 a)

public function getModel()
{
    if ( $this->texture ) return $this->texture->getModel();
}

其他方法是 -

b) 在 Monster 实体中同时拥有 ->getModel() 和 ->getTexture(),并添加一个验证规则来检查模型和纹理是否匹配。这里的缺点是我有效地创建了冗余数据,并且我有很多验证规则要添加到任何地方。

c) 添加一个在模型和纹理之间创建关系的 ModelInstance 类。这里的缺点是总体上有更多的查询/复杂性,并且模型和纹理之间的简单关系不再存在 - 它已被更复杂的东西所取代。我们还必须在 Texture 上添加一个唯一的约束。

很想听听其他人如何解决这个问题!

谢谢,詹姆斯

4

1 回答 1

0

由于纹理可以属于一个且仅属于一个模型,因此:

public function getModel()
{
    if ( $this->texture ) return $this->texture->getModel();
}

很好。

只需要确保调用 getModel 的任何东西都可以处理空结果。如果您只要求所有怪物都具有纹理并因此具有模型,那么您将为自己省去一些麻烦。

对我来说,相同的纹理不能用于不同的模型似乎有点奇怪。

您可能还会询问您希望按模型查询的频率。如果你会做很多,那么你可能想要继续,只是将模型添加到怪物,即使它有点多余。

于 2013-07-27T17:17:25.017 回答