it-roy-ru.com

Хранимые процедуры в Ruby на Rails

Я парень .net с 6-летним опытом. Недавно я начал работать над проектом ROR и понял, что хранимые процедуры/функции sql вообще не используются. Обратившись к нему, я узнал, что это обычная практика, и вообще никто в команде вообще не пишет sql запросы, все делается с помощью ActiveRecord.

Я погуглил о возможных причинах этого, но не нашел много информации. Так что мне просто интересно узнать

  1. Является ли обычной практикой, что хранимые процедуры/функции sql не являются предпочтительными для использования?
  2. Каковы плюсы и минусы использования хранимых процедур?
20
pramodtech

Является ли обычной практикой, что хранимые процедуры/функции sql не являются предпочтительными для использования?

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

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

Каковы плюсы и минусы использования хранимых процедур?

Они медленнее пишутся и их труднее изменить, и, следовательно, берут на себя расходы по разработке. Тем не менее, они могут быть быстрее, чтобы выполнить.

29
meagar

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

взято из >> Использование хранимых процедур в Rails

Подводя итог, нельзя сказать, что "Rails WAY" использует хранимые процедуры.

5
az7ar

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

Так что я бы выбрал «путь рельсов» с крошкой соли. Если хранимые процедуры работают для вас, используйте их.

5
Shayne

Является ли обычной практикой, что хранимые процедуры/функции sql не являются предпочтительными для использования?

Правда. Построение запросов с помощью Active Record позволяет вам управлять ими в коде приложения.

Каковы плюсы и минусы использования хранимых процедур?

Плюсы: вы можете скрыть сложную логику запроса из кода вашего приложения.

Минусы: вам нужно создать и выполнить миграцию, если вы хотите переписать процедуру.

Смотрите этот пример о сокрытии логики в представлении базы данных, также применимом к процедурам.

Pros Пример:

Вам нужно выбрать все отели с номерами, доступными между start_time и end_time. В каждом отеле есть total_rooms (целочисленный атрибут), hotel_times (объект, определяющий часы работы отеля) и некоторые бронирования (объект, определяющий пользователя, который забронировал номер в отеле). Некоторые отели большие и предлагают ежедневное бронирование. Другие отели небольшие и предлагают почасовое бронирование. Вы спрашиваете пользователя, когда он хочет забронировать, это может быть либо дата, либо дата со временем.

Это включает в себя некоторые объединения и подзапросы и создаст большой уродливый фрагмент кода Active Record. Вместо этого вы можете написать процедуру и вызвать ее так:

Hotel.find_by_sql ['SELECT * FROM hotels_available_between(?, ?)', start_time, end_time]

Оберните это в область видимости и получите больше Ruby-иша:

class Hotel < ActiveRecord::Base
  scope :available_between, -> start_time, end_time do
    find_by_sql ['SELECT * FROM hotels_available_between(?, ?)', start_time, end_time]
  end
end

Hotel.available_between start_time, end_time
1
João Souza