лучшая стратегия базы данных основанного на клиенте веб-сайта (Ruby on Rails)

Вы можете использовать SelectMany , чтобы объединить коллекции Child в одну коллекцию, а затем отфильтровать их:

parent
    .SelectMany(p => p.Children)
    .Where(c => c.GrandChildren
        .Any(g => g.Name == "John"))

5
задан John 8 December 2008 в 18:05
поделиться

3 ответа

Существуют преимущества для использования отдельного DBS (включая тех, которых Вы уже перечислили):

  • Полнотекстовые поиски станут медленными (в зависимости от возможностей Вашего сервера), когда у Вас будут миллионы блобов крупного текста для поиска.
  • Разделение DBS сохранит Вашу скорость при индексации таблицы более быстрой для каждого клиента. В частности, это могло бы расстроить некоторые Ваши более ранние клиенты принятия при принятии нового, крупного клиента. Внезапно их приложения пострадают для (им) никакая очевидная причина. Снова, если Вы остаетесь под мощностью своих аппаратных средств, это не могло бы быть проблемой.
  • Если бы Вы когда-либо отбрасываете клиент, это было бы незначительно более чисто, чтобы просто собрать их DB, чем удалить все их связанные строки client_id. И одинаково чистый для восстановления их, если они передумали позже.
  • Если какие-либо клиенты просят дополнительную функциональность, чтобы они были готовы заплатить за, можно разветвить их структуру DB, не изменяя ничей больше.
  • Для пессимистов: Меньше шанса, что Вы случайно уничтожаете все клиентские данные ошибкой, а не всего данными одного клиента.;)

Все, что, будучи сказанным, вероятно, лучше дано единственное решение DB:

  • Возможности Вашего сервера БД делают большую единственную таблицу надуманным вопросом.
  • Базы данных Вашего клиента, как гарантируют, останутся идентичными.
  • Вы не волнуетесь по поводу способности сохранить общие данные разделенными в целях архивировать/восстанавливать или в случае аварии.
2
ответ дан 14 December 2019 в 09:03
поделиться

Спасибо за замечательные комментарии. Я решил пойти с несколькими подход базы данных. Это - самый легкий путь для меня, так как я не должен переделывать целое приложение.

Что я собираюсь сделать, должен добавить before_filter в application_controller, таким образом, он относится ко всем контроллерам... что-то вроде этого:

before_filter :client_db         # switch to client's db

Затем в application_controller.rb я буду включать что-то вроде этого:

 def client_db
    @client = Client.find(params[:client_id]) 
    spec = Client.configurations[RAILS_ENV] 
    new_spec = spec.clone 
    new_spec["database"] = @client.database_name
    ActiveRecord::Base.establish_connection(new_spec) 
  end

Затем URL как example.com? client_id=12345 выберет корректную базу данных.

Так как я использую Apache в качестве прокси перед Полукровкой, Apache добавит корректный client_id ко всем запросам, на основе URL веб-сайта клиента. Таким образом, client_id на самом деле не будет частью URL, который видят пользователи. Это будет только передано между Apache и Полукровкой. Я не уверен, объясняю ли я это правильно, но это работает и содержит вещи в чистоте и простой.

Если я решаю, что должен использовать единую базу данных в будущем, я могу осуществить рефакторинг весь код затем. В данный момент это, кажется, самый простой подход.

Кто-либо видит какую-либо проблему с этим подходом?

- John

4
ответ дан 14 December 2019 в 09:03
поделиться

Я пошел бы для единой базы данных, с помощью клиентских идентификаторов - необходимо смочь сделать рефакторинг менее болезненным при помощи некоторой формы базовой модели и именованного объема для обзора любых действий к идентификатору того клиента.

Вы могли пользоваться библиотекой индексации, такой как Хорек или что-то вдоль тех строк, чтобы заниматься проблемой полнотекстовых поисков, становящихся медленными. Это будет проблемой так или иначе, после того как база данных единственного клиента становится к большому, таким образом, Вы, возможно, должны реализовать это так или иначе.

1
ответ дан 14 December 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: