Лучший способ обработать несколько таблиц, чтобы заменить одну большую таблицу в Rails?(например, «todo_items1», «todo_items2» и т. д. вместо «todo_items»)? - PullRequest
0 голосов
/ 23 апреля 2010

Обновление:

Первоначально, эта публикация использовала 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').

Спасибо!

1 Ответ

2 голосов
/ 23 апреля 2010

Это , а не способ масштабирования.

Вероятно, было бы лучше использовать репликацию «главный-подчиненный» и надлежащую индексацию (помимо первичного ключа) для таких полей, как «заголовок» и / или «автор», если вы собираетесь искать книги на основе. Имея это в n-таблицах, как вы узнаете лучшее место для поиска книги, которую ищет пользователь? Собираетесь ли вы смотреть 4 таблицы?

Я согласен с Горацием: «не пытайтесь решить проблему производительности, пока у вас не появятся цифры, чтобы доказать это». Тем не менее, я предлагаю вам действительно заняться добавлением индексов в свою таблицу, если вы хотите, чтобы поиск выполнялся быстро. Если они не быстрые, то сообщите нам как они не быстрые, и мы скажем вам, как заставить его работать ZOOOOOM .

...