我正在寻找一种合理的对象关系设计,用于在单个玩家游戏中存储给定玩家的默认数据变体(保存所有玩家在线存储的数据)。
我正在开发一个网页游戏,其中有一个“节点”树,代表其中的房间和对象。
玩家可以移动这些物体,因此我需要保存特定于该玩家的节点状态。
常见的游戏操作是获取节点的孩子。 (例如:房间里的所有物体)。
过去我使用过两张桌子和COALESCE
节点: id,parent_id,... node_specific data ...(默认设置和父级)
node_state: id,player_id,node_id,parent_id(父覆盖)
SELECT * FROM node LEFT JOIN node_state ON (node_state.player_id = $player_id
AND node.id = node_state.node_id)
WHERE COALESCE(node_state.parent_id, node.parent_id) = {$node_id}
OR COALESCE(node_state.parent_id, node.parent_id) = 0
这会存储默认树和玩家之间的差异,并使用Coalesce为该玩家提取。
使用Doctrine2我可以使用存储库方法,Native SQL和结果集映射来执行此操作,但肯定有更好的方法吗?
其他人如何为多个玩家处理保存游戏状态?为每个玩家克隆整棵树会更有意义吗? (当然会更容易使用Doctrine 2)