Какая модель базы данных более эффективна

Я разрабатываю систему лиг для игры.
Будет много лиг, и в лиге будет 50 игроков.

У меня есть две альтернативы:

1#

Table player{  
  playerid number primary key,
  leagueid number foreign key,
  score number
}

Table league{   
  leageuid number primary key  
}

Всякий раз, когда игрок с идентификатором лиги "x" хочет получить текущую таблицу лидеров.

  1. Серверная часть выберет всех игроков с идентификатором лиги «x».
  2. Отсортируйте данные, используя текущий счет игрока и возврат.

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" хочет получить текущую таблицу лидеров.

  1. Серверная часть выберет лигу с номером лиги "x"
  2. Для каждого playerid в "playerList" получите текущий счет "playerid" из таблицы "player".
  3. Отсортируйте все оценки и верните

Какая из альтернатив лучше? Если есть более эффективный способ, пожалуйста, дайте мне знать.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете решение № 2, у вас есть избыточная информация в league.playersList.

Что делать, если однажды вы обнаружите, что в списках двух лиг есть один и тот же игрок? Как вы можете быть уверены, что из них правильно?

Что, если вы затем проверите того же игрока в таблице player и обнаружите, что она ссылается на третью лигу, а эта лига даже не указывает игрока в своей таблице playersList? Теперь, как вы можете быть уверены, что какие-либо из ваших данных точны? Вам нужно будет выполнить полный поиск playersList каждой лиги и сравнить его с leagueid в послужном списке этого игрока.

Как это произошло? Случится ли это снова? Как вы узнаете, если это произойдет снова? Нужно ли вам каждый день заново сверять все списки игроков с соответствующими записями игроков?

Здесь показаны проблемы, возникающие при хранении значений в «списках» в базе данных. В итоге вы получаете денормализованные данные, и это создает множество потенциальных ошибок, за которыми вам нужно следить и которые неизбежно нужно исправлять.

Используйте раствор №1. Поставьте индекс на player.leagueid, чтобы сделать поиск эффективным.


Повторите ваш комментарий:

Проблема с производительностью... Выбирать игроков с одинаковым "leagueid" и сортировать их каждый раз, когда пользователь просматривает таблицу лидеров?

Вот где индекс может вам очень помочь. Цель индекса — позволить вашему поиску leagueid найти совпадающие строки без необходимости читать все 1 миллион строк.

Составной индекс на (leagueid, score) помог бы еще больше, избегая сортировки. Гарантируя, что индекс возвращает строки в том порядке, в котором вы хотите отсортировать, сортировка становится неоперативной.

Вам может понравиться моя презентация Как создавать индексы на самом деле или видео, в котором я это представляю.


P.S. Смотрите мой ответ на Действительно ли хранение списка с разделителями в столбце базы данных так уж плохо? больше проблем с хранением значений в списках.

Другие вопросы по теме