Я ищу разумный объектный дизайн отношений для хранения вариаций данных по умолчанию для данного игрока в однопользовательской игре (сохраняю данные, хранящиеся для всех игроков онлайн).
Я работаю надвеб-игра, в которой есть дерево «узлов», представляющих комнаты и объекты внутри них.
Игроки могут перемещать эти объекты, поэтому мне нужно сохранить состояние узла, специфичное для этого игрока.
Обычная игровая операция - получение дочерних узлов.(например: все объекты в комнате).
В прошлом я использовал две таблицы и COALESCE
узел: id, parent_id, ... node_specificdata ... (настройки по умолчанию и родительский элемент)
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)