2013-03-20 5 views
17

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

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

  1. Общепринятой практикой является использование хранимых процедур/функций sql?
  2. Каковы преимущества и недостатки использования хранимых процедур?

ответ

25

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

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

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

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

Они медленнее писать и сложнее изменить, и, следовательно, загружать затраты на разработку на передний план. Однако они могут быть быстрее выполнены.

+2

Я понимаю, что этот поток 4 года и 1 день назад, но хранимые процедуры «медленны для записи и более трудно меняются» - это полная ошибка. Конечно, я наткнулся на эту тему, потому что я тоже .Net парень, который должен обновить очень старый рубин на сайте rails. Мое предположение - хранимая процедура в БД, а не в Rails. Если это в Rails, я уступлю и скажу, что вы, вероятно, правы. Но SP в БД так же просто, как и получается. – Grandizer

5

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

взят из >>Using Stored Procedures in Rails

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

5

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

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

0

Насколько широко распространена практика использования хранимых процедур/функций sql?

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

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

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

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

See this example on hiding logic in a database view, also applicable to procedures.

Pros Пример:

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

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

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

Заверните его в рамки и получить больше рубиново-иш:

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