Обновление:
Первоначально, эта публикация использовала Books
в качестве примера сущности, с
Books1
, Books2
и т. Д., Являющиеся
отдельный стол Я думаю, что это было
немного сбивает с толку, поэтому я изменил
пример сущности должен быть "частным"
todo_items
созданный конкретным
пользователь ".
Такого рода первоначальные комментарии Горация и Райана кажутся немного странными, и
Я прошу прощения за то. Пожалуйста, знайте, что
их точки были действительны, когда это выглядело
как будто я имел дело с книгами.
Hello
Я решил использовать несколько таблиц для сущности (например, todo_items1
, todo_items2
, todo_items3
и т. Д.) Вместо одной основной таблицы, которая может иметь много строк (например, просто todo_items
). Я делаю это, чтобы попытаться избежать возможного падения производительности в будущем, которое может возникнуть из-за слишком большого количества строк в одной таблице.
С учетом этого я ищу хороший способ справиться с этим в Rails, в основном, пытаясь избежать загрузки группы неиспользуемых ассоциаций для каждого объекта User. Я предполагаю, что другие сделали что-то подобное, так что, вероятно, есть несколько хороших советов / рекомендаций.
(Я знаю, что мог бы использовать для этого раздел, но сейчас я решил пойти по пути «нескольких таблиц».)
Каждый пользователь размещает свои todo_items в определенной таблице. Фактическая таблица «todo items» выбирается при создании пользователя, и все его todo_items попадают в одну и ту же таблицу. Данные в их коллекции todo items
являются частными, поэтому, когда придет время обрабатывать пользователей todo_items, мне нужно будет взглянуть только на одну таблицу.
Одна вещь, которую я не особо хочу иметь, это группа неиспользуемых ассоциаций в классе User. Прямо сейчас, похоже, я должен сделать следующее:
class User < ActiveRecord::Base
has_many :todo_items1, :todo_items2, :todo_items3, :todo_items4, :todo_items5
end
class todo_items1 < ActiveRecord::Base
belongs_to :user
end
class todo_items2 < ActiveRecord::Base
belongs_to :user
end
class todo_items3 < ActiveRecord::Base
belongs_to :user
end
Дело в том, что для каждого отдельного пользователя только одна из таблиц "todo items" может быть использована / применима / доступна, так как все todo_items пользователя хранятся в одной таблице. Это означает, что в любое время будет использоваться только одна из ассоциаций, а все остальные загруженные has_many :todo_itemsX
ассоциации будут бесполезны.
Например, с user.id
из 2 мне нужно всего лишь todo_items3.find_by_text('search_word')
, но, как я думаю об этом, я все равно имею доступ к todo_items1, todo_items2, todo_items4 и todo_items5.
Я думаю, что эти "дополнительные ассоциации" увеличивают накладные расходы и делают размер каждого объекта User в памяти намного больше, чем должен быть. Кроме того, есть несколько вещей, которые Ruby / Rails делает в фоновом режиме, что может вызвать другие проблемы с производительностью.
Я также предполагаю, что могут быть некоторые дополнительные издержки вызова / поиска метода для каждого объекта User, поскольку он должен загружать все эти ассоциации, что, в свою очередь, создает все эти хорошие, динамические методы доступа к модели, такие как User. find_by_something.
Я не знаю, действительно ли Ruby / Rails внутренне справляется со всеми этими has_many
ассоциациями, так что, возможно, это не так уж и плохо. Но сейчас я думаю, что это действительно расточительно, и что может быть лучший, более эффективный способ сделать это.
Итак, несколько вопросов:
1) Существует ли какая-то особая методология Ruby / Rails, которую можно применить к этой схеме «несколько таблиц для представления одной сущности»? Есть ли для этого «лучшие практики»?
2) Действительно ли плохо иметь так много неиспользованных has_many
ассоциаций для каждого объекта? Есть ли лучший способ сделать это?
3) Есть ли у кого-нибудь совет, как абстрагироваться от того факта, что за одной моделью / классом todo_items
стоит несколько таблиц "todo items"? Например, чтобы я мог позвонить todo_items.find_by_text('search_phrase')
вместо todo_items3.find_by_text('search_phrase')
.
Спасибо!