【发布时间】:2023-03-21 01:55:02
【问题描述】:
我正在尝试从我自己的伪 ORM 转移到使用 Propel(因为我以前的代码实际上是 Active Record)并努力寻找“最佳”方法来解决由以下组成的类的问题变化和固定的属性。
这是一个游戏,我在地图上有可以在整个游戏中更改所有者的区域,所以我需要存储游戏 ID(因为可以同时进行多个游戏)和区域表中的当前所有者,但是我还需要参考诸如地区名称,是否可以在那里招募,起始所有者等内容;所有这些都是针对该地区固定的,不会在游戏内或游戏之间改变。
例如,“肯特”地区最初可能归英国人所有,但可能被法国人占领,但它始终被称为“肯特”,您始终可以在那里招募人员,并且它始终是较大国家“英格兰”的一部分'。
我可以看到的选项是:
- 具有不受 Propel 控制的查找 .ini 文件或数据库表 并且只是将名称等作为主要区域表上的字段
- 在区域表上有一个“details”表和一个“details_id”作为字段
- 使用硬编码的“详细信息”为每个区域创建一个类(尽管这对我来说似乎难以维护和错误检查)
- 我没有想到的“更好”的东西
这一定是一个标准问题,我很抱歉没有找到正确的搜索词,但我一直在努力解决它一段时间,无法让某些东西直观地工作!
根据要求澄清我的数据库结构 -
区域表
id | game_id | owner | turn_last_conquered | details_id | population
----|---------|-------|---------------------|------------|-----------
1 | 100 |England| 2 | 1 | 10
2 | 101 | France| 3 | 1 | 12
区域详情表
id | name | port | fortified | starting owner | starting population
----|------|------|-----------|----------------|--------------------
1 | Kent | 1 | 0 | England | 13
区域表中的两个条目对应不同游戏中的肯特。如果我将属性作为区域对象/表的一部分,那么如果我想在每个游戏中更改某些东西的名称,我必须更新所有受影响的行,而如果它在单独的表中,那么我会只需更新那个,更改就会传播。我自己的系统用必填字段填充了 Region 对象,使用 Propel 我试图找到一种方法来解决拥有“RegionDetails”对象的方法,但也许我不应该这样做。
【问题讨论】:
-
只有一个问题是标准的,并不一定意味着有一个标准的解决方案。将所有数据保存在同一个存储层中是我在快速阅读时可以给出的第一个建议,但请注意,您的问题可能会引发讨论,然后将被关闭,因为它可能是固执己见的。
-
还有一个提示:首先移动。然后根据需要改变数据库设计。不要混合这两种操作。
-
我一直这样做。我不明白你遇到的困难。我只是将与区域相关的所有数据(名称、所有者等)放在区域表中。我不明白为什么他们会成为一个问题。你能帮我看看你用这种方法遇到了什么问题吗?
-
@Ben 我可能对规范化感到头晕目眩,这似乎是在查找表中包含其他详细信息的“更好”方法。如果我更改区域的名称,那么使用您的方法,我必须更新受影响的区域表中的每个条目,而不仅仅是查找表。当然,更新会很容易......
-
我真的不明白如何将所有者ID和区域名称存储在同一个表中。我一定不会看到与您看到的相同的数据库结构。我认为您问题的症结在于您所看到的“固定”和“变化”属性之间的区别。我真的还是不明白你的问题。也许看看它目前是如何完成的会有所帮助,这样我就可以展示如何将相同的数据库结构与 Propel 一起使用。