Лучшая структура базы данных для создания уровней и обновлений - PullRequest
0 голосов
/ 18 ноября 2018

Я строю игру, в которой игрок должен строить различные типы зданий и может улучшать их. Некоторые здания могут быть улучшены до уровня 30, а некоторые - только до уровня 5.

Интересно, какая база данных лучше для этого подходит? Я использую sqlite3, если это что-то меняет, но вопросы относятся и к другим движкам.

У меня есть два варианта для моей таблицы buildings:

Вариант один: Сделать столбец building_group, чтобы определить, какие здания похожи:

id (Integer, Auto increment), building_name, building_group, level, points, cost
1, path, 1, 1, 100, 1000
2, road, 1, 2, 200, 2000
3, highway, 1, 3, 300, 3000
4, village, 2, 1, 1000, 10000
5, town, 2, 2, 2000, 20000
6, city, 2, 3, 3000, 30000

Вариант два: Иметь одну запись на здание и иметь всю информацию об уровне в одной строке. Мне это кажется не лучшим подходом, но я все равно упомянул об этом.

id (Integer, Auto increment), building_name_1, points_1, cost_1, building_name_2, points_2, cost_2, building_name_3, points_3, cost_3,...
1, path, 100, 1000,road, 200, 2000, highway, 300, 3000
2, village, 1000, 10000, town, 2000, 20000, city, 3000, 30000

Я уверен, что есть лучшие способы справиться с этим, и я хотел бы услышать ваши предложения.

1 Ответ

0 голосов
/ 28 декабря 2018

Как вы заметили, второй подход имеет мало смысла. Чтобы эффективно запрашивать или обновлять его, вам нужно будет динамически создавать имена столбцов, что является отличным источником для трудно отслеживаемых ошибок (не говоря уже о потенциальной уязвимости для SQL-инъекций, если вы не делаете это должным образом). Более того, рано или поздно вам придётся подумать о каком-то супер-особенном обновлении, уровень которого выше, чем у изначально запланированных столбцов, и вам придется изменить определение таблицы просто чтобы приспособиться, что не имеет никакого смысла.

Первый дизайн выглядит как учебник, который позволяет легко создавать сложные запросы на зданиях и на том, что игрок построил или не построил. Если вам когда-нибудь понадобится извлечь некоторые общие данные для всей группы зданий, вы можете создать другую таблицу building_groups с этой информацией и сделать столбец building_group в buildings внешним ключом для своего первичного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...