Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Все вы хотите что то к ORM притянуть за хвост. Зачем?
Т.е. вы подразумеваете что если ООП то полюбому ORM удобнее использовать? Ну че за бред то? :(
Вы ищите какое то золотое объяснение использования ORM. Не надо. Поймите чем хороша технология сама по себе.
Там где это удобно это надо делать.
Если вы работаете с MVC в ООП среде, то обычно Model это объект или коллекция объектов. В случае если вы не хотите ничего ломать у вас где-то возникнет хоть какой-то примитивный ORM который будет маппить данные из базы в объекты и обратно.
Я использую технологии только там где они приносят profit, если они его не приносят я его там не использую.
Я тут говорил не про применимость ORM, а про ваше объяснение причин использования ORM. Объяснения, которые вы тяните за хвост.
Но причины этого не использование MVC + ООП. Поймите что здесь нет связи.
Не делайте не верных выводов. Я сказал только что в MVC удобно использовать ORM в силу того что MVC применяется чаще всего вместе с ООП и M чаще всего представлен как объект или коллекция объектов. А вы тут напридумывали что я из-за MVC использую ORM.
К примеру если у вас используется MVC для web-приложения, то лучше как раз использовать ORM
ORM проще понять, чем SQL (можно и не знать SQL если использовать ORM)
Он эффективен на ранних стадиях (по быстренькому чего-нить написать)
Если приложение усложняется, то все плюсы ORM гаснут — приходиться учить SQL, дописывать…
Объекты — это не адекватный способ представления реляционной структуры
Если ваши данные — объект, то лучше использовать NoSQL-решения
Из-за реляционной природы появляются накладные расходы при создании объекта
Можно мыслить реляционно и тогда реляционная БД в большинстве случаев будет для вас лучше, а можно мыслить документами, тогда мнение может измениться. Я ни в коем случае не говорю, что NoSQL > SQL.
вы предлагаете обход/маскировку проблемы
Генерация объектов ORM должна идти от таблиц в базе, а не наоборот.
Все зависит от точки зрения — строим базу данных для приложения, или приложение для базы данных.
Замечу, что подход, где приложение первично, заметно выигрывает по простоте разработки и надежности.
Спор на тему что использовать: DatabaseFirst\CodeFirst.
А какое это имеет отношение к тому, что из чего генерируется, что я
использую CodeFirst или DatabaseFirst?
Вы хотите сказать что я заведомо подразумеваю что это все будет ложиться на реляционное отображение? Так вот, конечно я это подразумеваю, и буду проектировать свою доменную модель так, что бы ее можно было замаппить без последствий на реляционное отображение.
Тут вопрос понимания технологии играет роль. И если человек знает что такое ORM, он не встретит никаких проблем при использовании подхода CodeFirst.
Это и есть DatabaseFirst. Я под CodeFirst подразумеваю подход когда народ колбасит декомпозицию предметной области сначала в ООП, а потом уже как-то пытается это упихнуть в базу.
Генерация объектов ORM должна идти от таблиц в базе, а не наоборот.
#M_FORCEPLAN
select ...
from table1 #M_NOLOCK_INDEX (XPkTable1)
inner join table2 #M_NOLOCK_INDEX (XpkTable2)
on ...
where ...
#M_FORCEORDER
Меня попросили показать, как и что умеет ActiveRecord в рельсах, я показал.Мне показалось, что там было всего пару слов про ActiveRecord, всё остальное — про генераторы кода, миграции и прочие приятности, не имеющие ни малейшего отношения к ORM.
Про 20 лет — просто наблюдение человека, смотрящего со стороны. Такое все жалкое, недоделанное (Entity Framework, Fluent) и тд.Почитайте Фаулера «Patterns of Enterprise Application Architecture», Active Record ничуть не современнее, чем Data Mapper. Если вы не понимаете смысла незнакомого паттерна, это ещё не значит, что его реализация «жалкая и недоделанная», просто паттерн призван решать задачу по другому и ожидать что NHibernate, реализующий Data Mapper, когда-либо станет похож на Active Record из Rails (а видимо именно по мере похожести определяется доделанность в вашем случае) по меньшей мере очень странно.
Руби озадачивает скоростью, этого достаточно, чтобы во многих нишах о нем даже не вспоминать.Ну причём тут скорость, мы тут что вообще обсуждаем архитектурные решения или синтетические тесты, результаты которых ничего не значат в реальном мире.
И да, я не видел ни одного крупного проекта, написанного на руби/рельсах с помощью DataMapper'a вместо AR.А уверен, что видел код всех крупных проектов на руби?
Data.FindAll<Post>().Where(IsPopular).Paginate(10).user = User.create(:login => "login", :password => "password")
user.posts — тут будет пустой массив, у юзера нету постов
user.posts.create(:title => "first post")
user.posts.count — вернет 1, у юзера есть 1 пост
user.posts.first.title — вернет заголовок первого поста
user.posts.first.user — вернет то же, что и user.
Post.create(:title => "second post", :user_id => user.id)
Post.create(:title => "third post", :user => user)
post = Post.new(:title => "fourth post")
post.user = user
post.save!
В файле модели user.rb нужно (между class и end) написать has_many :posts, :dependent => :destroy, а у поста — наоборот belongs_to :user.
Теперь если мы удалим юзера, удалятся все его посты (dependent можно не указывать, тогда не удалятся)
ORM — это такая специальная херня, благодаря которой малейшее изменение схемы базы приводит к правке кода не меньше чем в 50 местах.Приведите пример 50 мест, в которых приходится править код при малейших изменениях схемы данных.
В 1С на уровне приложения есть логические транзакции, когда можно «откатить» состояние произвольного объекта. Это что-то вроде возможности выборочно откатывать уже закрытые транзакции без нарушения целостности.
Не уверен, что СУБД так умеют, а сама 1С делает это неэффективно (автоматом блокирует чуть ли не всю базу целиком), но зато гарантирует целостность и непротиворечивость.
это зависит от бизнес-модели. чем мы рискуем — излишним качеством или недостаточной скоростью разработки?
так или иначе, изменять предметную область только из-за того, что она неэффективно хранится в БД — лютое ССЗБ. Большая часть предметных областей «реальной жизни» криво хранится в SQL-based.
И эмулируя ручками переход от предметной области к SQL-based, кто поручится, что эта эмуляция будет намного лучше автоматической работы ОРМа?
эта кривизна зависит от предметной области!
вот, допустим, есть у нас документооборот. Там всё таблицами, да связями между ними. Эта задача ложится на sql.
а теперь возьмем сетевую файловую систему, или еще какие-нибудь графы и кубы. Эта задача не ложится на SQL!
Документная БД — самое меньшее, что здесь нужно. Опытный разработчик может написать 2 тонны костылей, и таки заставить постгрес прохавать эту задачу, но костылями от этого они быть не перестанут.
когда схема БД постоянно меняется в зависимости от ситуации (или разработчики кодят очень быстро, или вообще схема строится автоматически by design) — какие тут нормальные формы?!
Так нужен ли ORM в крупном и сложном Enterprise-проекте?