#mysql #ruby-on-rails #ruby #database
#mysql #ruby-on-rails #ruby #База данных
Вопрос:
Это довольно странный вопрос, но я постараюсь объяснить его в меру своих возможностей.
Допустим, у меня есть следующие две таблицы:
table: cars
--------------- ------------ ---------------- --------------
| color | size | capacity | origin |
--------------- ------------ ---------------- --------------
table: users
---------------- --------------- -------------------- -----------------
| desired_colors | desired_sizes | desired_capacities | desired_origins |
---------------- --------------- -------------------- -----------------
Очевидно, что таблица cars будет состоять из уникальных автомобилей с цветом, размером, вместимостью и происхождением.
В таблице users пользователь выберет несколько цветов, которые они хотят, несколько размеров, которые они хотят, несколько мощностей, которые они хотят, и несколько источников, которые они хотят.
Теперь мне интересно, как наилучшим образом добиться «оценки соответствия» между желаемыми характеристиками пользователя и каждым транспортным средством. Таким образом, пользователи могут видеть лучшие соответствия автомобилей, которые они хотят.
У меня есть несколько идей о том, как я мог бы это сделать, но мне было интересно, что, по мнению всех присутствующих, было лучшим способом сделать что-то подобное. Я думаю, что лучший способ — иметь таблицу «совпадений», показывающую совпадение между user_id
, car_id
и a match_score
— но я не уверен, как и когда я буду запускать эти вычисления и сохранять эти данные. Еще одна вещь, о которой стоит подумать, — это если я решу изменить критерии оценки.
В любом случае, я знаю, что это странный вопрос, и я, возможно, не получу много ответов, но просто надеюсь расшевелить банк и посмотреть, есть ли у кого-нибудь хорошие идеи.
Спасибо всем 🙂
Ответ №1:
Я бы просто определил свои соответствия в запросе, а не сохранял его в таблице. Если ожидается, что ваш набор данных будет огромным, может быть более эффективным предварительное вычисление совпадений, но, по всей вероятности, это было бы преждевременной оптимизацией. Итак, что бы я сделал, это загрузил нужные функции при входе пользователя в систему, а затем запустил запрос, подобный этому:
select *,
if(color in ('green', 'red', blue', ...), 10, 0)
if(size in (...), 10, 0)
if(capacity in (...), 10, 0)
if(origin in (...), 10, 0) as score
from cars
where color in ('green', 'red', blue', ...)
or size in (...)
or capacity in (...)
or origin in (...)
Комментарии:
1. Это сработало бы изначально. Спасибо за ваш вклад. Если мне когда-нибудь понадобится предварительно вычислить эти соответствия, как я могу это сделать, cron?
2. Хотя, возможно, мне придется рассмотреть что-то более сложное, поскольку я пытаюсь получить очень точное совпадение результатов.
3. Да. Просто создайте таблицу сопоставления «много-много», в которой хранятся отношения с пользователем и соответствующие автомобили, а также оценка для каждого отношения. Затем обновите значения в этой таблице с помощью задания cron.
4. Вы всегда можете использовать подход «много-много таблиц отношений», а затем либо динамически загружать его, когда пользователи входят в систему и запрашивают информацию, либо заполнять его с помощью задания cron. Если ваша формула сложна, вы могли бы извлечь функциональность из mysql и написать этот процесс на ruby. В качестве альтернативы, вы могли бы просто написать пользовательскую функцию в mysql, которая вычисляет оценку, если вы предпочитаете хранить ее внутри базы данных, что может быть быстрее.
5. Похоже, что это правильный путь. Мы ожидали большого объема, не уверены, насколько это будет обременительно для базы данных, но это могло бы избавить нас от головной боли, связанной с дополнительной работой. Спасибо за вашу помощь 🙂