Я разрабатываю систему лиг для игры.
Будет много лиг, и в лиге будет 50 игроков.
У меня есть две альтернативы:
1#
Table player{
playerid number primary key,
leagueid number foreign key,
score number
}
Table league{
leageuid number primary key
}
Всякий раз, когда игрок с идентификатором лиги "x" хочет получить текущую таблицу лидеров.
2#
Table player{
playerid number primary key,
leagueuid number foreign key,
score number
}
Table league{
leagueid number primary key
playersList array of playerid's
}
Всякий раз, когда игрок с идентификатором лиги "x" хочет получить текущую таблицу лидеров.
Какая из альтернатив лучше? Если есть более эффективный способ, пожалуйста, дайте мне знать.
Если вы используете решение № 2, у вас есть избыточная информация в league.playersList
.
Что делать, если однажды вы обнаружите, что в списках двух лиг есть один и тот же игрок? Как вы можете быть уверены, что из них правильно?
Что, если вы затем проверите того же игрока в таблице player
и обнаружите, что она ссылается на третью лигу, а эта лига даже не указывает игрока в своей таблице playersList
? Теперь, как вы можете быть уверены, что какие-либо из ваших данных точны? Вам нужно будет выполнить полный поиск playersList
каждой лиги и сравнить его с leagueid
в послужном списке этого игрока.
Как это произошло? Случится ли это снова? Как вы узнаете, если это произойдет снова? Нужно ли вам каждый день заново сверять все списки игроков с соответствующими записями игроков?
Здесь показаны проблемы, возникающие при хранении значений в «списках» в базе данных. В итоге вы получаете денормализованные данные, и это создает множество потенциальных ошибок, за которыми вам нужно следить и которые неизбежно нужно исправлять.
Используйте раствор №1. Поставьте индекс на player.leagueid
, чтобы сделать поиск эффективным.
Повторите ваш комментарий:
Проблема с производительностью... Выбирать игроков с одинаковым "leagueid" и сортировать их каждый раз, когда пользователь просматривает таблицу лидеров?
Вот где индекс может вам очень помочь. Цель индекса — позволить вашему поиску leagueid
найти совпадающие строки без необходимости читать все 1 миллион строк.
Составной индекс на (leagueid, score)
помог бы еще больше, избегая сортировки. Гарантируя, что индекс возвращает строки в том порядке, в котором вы хотите отсортировать, сортировка становится неоперативной.
Вам может понравиться моя презентация Как создавать индексы на самом деле или видео, в котором я это представляю.
P.S. Смотрите мой ответ на Действительно ли хранение списка с разделителями в столбце базы данных так уж плохо? больше проблем с хранением значений в списках.