Проектирование базы данных MySQL и эффективный запрос

#mysql #database-design

#mysql #проектирование базы данных

Вопрос:

У меня есть следующие таблицы:

 users (id, first_name, last_name)

category (id, name)

rank(id, user_id, rank)
  

Каждый пользователь может принадлежать к нескольким категориям. И все пользователи находятся в таблице рангов и имеют значение от 0.0 до 1.0, где 0 — самый низкий ранг, а 1 — самый высокий. Я хотел бы настроить дополнительные таблицы для создания следующей веб-страницы:

Посетитель страницы (идентифицируемый либо одним из записанных идентификаторов в таблице user, либо числовым представлением их IP-адреса) выбирает категорию и получает двух случайно выбранных пользователей из таблицы users таким образом, что:

1) посетитель_id_пользователя не видел это сопряжение в течение 24 часов

2) два пользователя принадлежат к выбранной категории

3) два пользователя находятся в пределах 1 значения ранга друг от друга. Позвольте мне объяснить, что последний критерий — если ранги были отсортированы, два выбранных пользователя будут иметь смежные ранги.

Это сложно, и я не могу понять, как это сделать эффективно

Я действительно ценю любую помощь в этом направлении.

Спасибо

Комментарии:

1. Являются ли ранги строковыми или числовыми?

Ответ №1:

Вам просто нужны еще две таблицы, а остальные идут в логике вашего сайта.

 user_category(user_id, category_id)
user_pairing(first_user_id, second_user_id, last_seen)
  

Первая таблица должна представлять отношения ManyToMany между пользователями и категорией, а вторая — для сопряжения пользователей.

Ответ №2:

Я согласен с @Yasel, я хочу добавить, что вам правильно нужна другая таблица

 candidate(first_user_id, second_user_id);
  

эта таблица используется для предварительного вычисления кандидатов для каждого пользователя, эта candidate таблица заполняется каждый час / день, поэтому, когда каждому first_user_id, second_user_id назначается, эта пара удаляется из candidate таблицы и перемещается в user_pairing таблицу. поэтому каждый раз вам нужно запрашивать только candidate таблицу, которая должна быть эффективной.