#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
таблицу, которая должна быть эффективной.