Скажем, у меня есть приложение Rails 3 со следующими модельными ассоциациями:Плохой дизайн данных для дублирования ассоциаций Rails?
user
belongs_to :group
item
belongs_to :group
belongs_to :user
Если код не обязательно написано, это может привести к неточностям данных, где:
item.group
и
item.user.group
больше не возвращают ту же группу, когда они должны. Элемент всегда должен принадлежать только одной группе.
Мое понимание заключается в том, что эта дублируемая ассоциация, возможно, была создана для упрощения запросов (уменьшите количество подключенных таблиц).
Итак, мой вопрос в том, является ли это просто ужасной практикой или это вопрос правильных компромиссов, что существуют случаи, когда дублирование данных и ассоциации приемлемо, потому что мы можем упростить запрос с меньшим количеством объединений.
UPDATE
До сих пор кажется, что ответ «компромиссы», а не «плохая практика/код запах».
Там, кажется, несколько способов, которыми это может быть обработан, вероятно, с сочетанием ограничений, преимущества, недостатки, прецедентами и т.д.:
1) Денормализованные, дублированные данные, как выше 2) пункт has_one: группа ,: через =>: пользователь 3) элемент делегат: группа: to =>: пользователь
Я пытаюсь понять различия между подходами № 2 и № 3. После экспериментов с обоими подходами в консоли кажется, что запросы, созданные Rails при вызове item.group, будут разными. (2) создает один запрос, который объединяет группы и пользователей. (2) создает два запроса, сначала для поиска пользователя, а затем для поиска группы на основе пользователя.
@BillyChan Почему вопрос не имеет недопустимого кода или даже никакого кода вообще? Концепции можно обсуждать без кода. Можно задать вопросы о концепциях. – Ben
Бен, извините, если мои слова звучат не вежливо. Но ваш вопрос выглядит не так серьезно. Если элемент принадлежит пользователю, по крайней мере у пользователя должно быть много элементов? Почему вы не можете написать это под вопросом? Или это отсутствие другой стороны также является частью краевого случая? Почему вы не можете показать полную групповую ассоциацию?Край случае не ошибается, но было бы лучше, чтобы все остальные части были чистыми и статичными. –
Билли, я решил добавить наименьшее количество псевдокодов, что было необходимо для понимания вопроса. Я сделал это, потому что он делает меньше чтения для других пользователей stackoverflow. Я не думал, что другие ассоциации актуальны. Если пользователь has_many items или has_one не имеет значения для вопроса. Вопрос напрямую связан с тем, не имеет ли дублирующихся данных или, следовательно, вероятность потери целостности данных, является оправданным компромиссом, если вы получаете производительность запросов и более простые запросы. – Ben