Чи ORM є антидіаграмою? [зачинено]


58

Я мав дуже стимулюючу та цікаву дискусію з колегою про ORM та її плюси та мінуси. На мою думку, ОРМ корисний лише у найрідкісніших випадках. Принаймні в моєму досвіді.

Але я не хочу перераховувати власні аргументи наразі. Тож я запитую вас, що ви думаєте про ORM? Які плюси і мінуси?



2
Так. Якщо у вас немає загальної програми CRUD, яка не робить нічого корисного з базою даних, тоді ви не повинні використовувати реляційну базу даних.
Райнос

1
@derphil: Ви можете зробити її менш широкою, інакше це буде закрито. Якщо ви вважаєте, що це антидіаграма, можливо, вкажіть, чому, а потім запитайте, в яких ситуаціях цей антидіапазон доцільний (але це все ще може бути занадто широким).
FrustratedWithFormsDesigner

2
@derphil, у коментарях до цього блогу є багато контраргументів, ви їх читали?
Péter Török

2
І ще одне підтвердження того, чому вам не потрібна ORM: medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Відповіді:


83

Існує досить великий і різноманітний набір концептуально-технічних труднощів при спробі наблизитись до реляційної бази даних з об'єктно-орієнтованого кута. Ці труднощі спільно називають невідповідністю об'єктно-реляційного імпедансу, і відповідна стаття у Вікіпедії є надзвичайно інформативною. У статті виділяється досить багато, я не бачу жодного розумного способу їх опису тут. Просто, щоб дати вам загальну думку, вони каталогізуються як:

  • Невідповідність
    • Об'єктно-орієнтовані концепції
    • Різниці типів даних
    • Структурні та цілісні відмінності
    • Маніпулятивні відмінності
    • Трансакційні відмінності
  • Вирішення невідповідності імпедансу
    • Мінімізація
    • Альтернативні архітектури
    • Компенсація
  • Суперечка
  • Філософські відмінності

Я думаю, якщо ви знайдете час, щоб прочитати статтю, ви зрозумієте, що факт, що ORM іноді описується як анти-шаблон, насправді неминучий. Два домени настільки різні, що будь-який підхід до трактування одного як іншого є за замовчуванням анти-шаблоном, в тому сенсі, що антидіапазон - це шаблон, що суперечить філософії домену.

Але я не думаю, що цей термін повинен застосовуватися до всього, що по суті є мостом між двома надзвичайно різними доменами. Позначення шаблону антидіаграмою має сенс лише в межах його домену. Тож питання про те, чи це анти-візерунок чи ні, не має значення.

Але чи корисна вона? Так, ORM - це один із найкорисніших антидіаграмів. Ви зрозумієте, чому тільки якщо ви опинитесь у практичній ситуації, коли вам доведеться міняти бази даних у проекті. Або навіть оновити до іншої версії тієї ж бази даних. ORM - це одне з тих речей, яке ви повністю розумієте лише тоді, коли вони вам справді потрібні.

Звичайно, ORM, як все корисне, сильно схильний до зловживань. Якщо ви думаєте, що це якимось чином замінює необхідність знати все про базу даних, над якою ви працюєте, то вона повернеться і вкусить вас. Важкий.

Нарешті, дозвольте мені безсоромно підключити ще одну з моїх відповідей на тему "Чи дотримується / підтримує модель ActiveRecord / заохочує принципи дизайну SOLID?" питання, яке для мене є куди більш актуальним питанням, ніж "чи це анти-шаблон".


5
+1 для роботи у фразі "невідповідність імпедансу". Казкові слова для вигуків, але мені вони теж подобаються!
хардмат

Повністю згоден ... перевірити це посилання так добре пояснено: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino

42

Це схоже на запитання: "силова дриль є антидіаграмою?". ORM заслужили гарне місце в моїй панелі інструментів, зменшивши код котла, і я все ще можу використовувати користувальницький SQL при необхідності. Тож якщо це антидіапазон, проти якого шаблону це йде?

Моя відповідь - ні, там є багато зрілих ОРМ, які полегшують ваше життя та роблять ваш код більш зрозумілим. Це в будь-якому випадку означає, що вам не потрібно розуміти SQL, навпаки.


11
+1 Я теж думаю, що це дуже корисно, є крива навчання. Але дуже приємно не вручну заповнювати піхоли тощо.
NimChimpsky

18

Я б хотів би назвати щось "анти-візерунком", який вперше був названий зразком Мартіном Фаулером і з тих пір був застосований майже в кожній сучасній мові програмування. (Дивіться статтю Вікіпедії на ActiveRecord .)

Хороший ORM може призвести до набагато меншого коду (і набагато менше повторення) в проекті, і ніщо так сильно не корелює з помилками, як кількість оригінального коду.

ORM, як правило, призначені для обробки найпоширеніших випадків використання для роботи з базами даних. Складні запити все ще потрібно писати явно. Але я категорично не рекомендую писати явні запити для кожної взаємодії з базою даних. У більшості випадків це марна трата часу.


12
"Я б вагався, щоб виступити проти аргументу влади"
Райнос

3
@Raynos: Ти маєш на увазі ... ти кажеш ... Фаулер, можливо, був .... НЕПРАВНО?!?! шок і зітхання єресі! Богохульство !! : P;)
FrustratedWithFormsDesigner

9
@Raynos - Можливо, влада - це не найкращий аргумент, але ОП заявила "по моєму досвіду". Це по суті заклик до особистих повноважень, тому я вважаю, що розумно протидіяти зверненню до влади та консенсусу. Крім того, сам термін "анти-модель" стосується думок. Я наводив приклади того, що думають інші.
Натан Лонг

3
@NathanLong Я просто вказував, що популярність і коректність є ортогональними.
Райнос

1
FWIW Data Mapper - це, мабуть, зразок, який найбільш близько відображає ORM. ActiveRecord - це інший зразок, хоча, безумовно, пов'язаний.
JasonTrue

11

Використання ORM замість вивчення SQL - досить погана ідея. Якщо ви точно не знаєте, який тип генерується SQL, якщо ви не розумієте проблем N + 1 і як їх оптимізувати, це однозначно принесе більше шкоди, ніж користі. Я вважаю, що я набагато продуктивніше використовую ORM. Я віддаю перевагу Rails ActiveRecord, який не намагається зробити вигляд, що немає бази даних і не заважає вам, якщо вам просто потрібно написати SQL. Я хвилююся, хоча деякі люди можуть довіряти ідіомам, які вони бачать занадто глибоко, без глибокого розуміння того, що вони роблять.


11

Мій досвід: я використовую NHibernate з Linq2NHibernate.

Плюси:

  • Він позбавляється від "Чарівних струн", або, принаймні, пропонує колись і єдине місце для їх розміщення
  • Це дозволяє мені працювати в парадигмі OO весь час
  • Код легше читати
  • Код, вбудований зверху, легше змінити
  • Це дозволяє обміняти фактичну реляційну базу даних без обслуговування 2 окремих сховищ (рідко робиться, але це одна велика перевага, якщо вона вам потрібна).

Мінуси:

  • Код важче написати , тому що
  • Це недостатня абстракція - ви все ще повинні бути глибоко знайомі з тим, що це робить на задньому плані

Я скажу, що це не відповідає обіцянкам, на які спочатку сподівається більшість людей. Я б не звинувачував когось, що сказав, що це анти-модель. Я вважаю, що в моєму випадку мені ще потрібно зробити тести інтеграції проти бази даних SQLite, щоб переконатися, що мої запити Linq2NHibernate справді працюють. Тож справді, якщо ви все-таки робите тести інтеграції на основі реальних реляційних баз даних, то такий спосіб усуває проблему з "магічними рядками".

Якби я розпочав новий проект, я не впевнений, використовував би я ORM чи ні. Я , ймовірно , буду, але я не можу сказати напевно , ви повинні. Я б сказав, що це як різниця між вибором C ++ або Java / .NET для вашого проекту: чи вам буде потрібна гнучкість, яку ви отримуєте, працюючи на нижчому рівні, чи хочете скоріше працювати на більш високому рівні та (нібито) бути більше продуктивні? Нормальна відповідь - працювати на такому високому рівні, на який ви можете піти . Зазвичай це означає використання ORM.


6

Сила ORM полягає в тому, що він дозволяє моделювати поведінку додатків, використовуючи об'єктно-орієнтовані методи. У ретельно сконструйованому світі у вас є один шар програми, де мова бізнесу чітко відповідає мові команди розробників. ORM - це умова, якщо ORM використовується розумно.

Слабка слабкість полягає в тому, що кількість людей, які насправді насправді отримують об'єктно-орієнтоване програмування, досить невелика. Дуже багато людей пишуть спагетті та фрикадельки, із сильно зв'язаними об'єктами, які мають мало власної поведінки, а насправді поведінка опиняється в огидних 8000-рядкових класах "Сервіс" та "Менеджер", і цей код часто настільки заплутаний, що всі бояться змінити його, оскільки вони не можуть зрозуміти, які будуть побічні ефекти.

Крім того, багато людей насправді не отримують реляційну модель. ORM не допоможе їх отримати, і це не допоможе їм, абстрагувавши реляційну модель. Це просто дозволяє зосередити увагу на доменному шарі на початку та отримати це право, перш ніж ви почнете занадто турбуватися про дизайн бази даних. Якщо це добре застосовано, за допомогою розумних інструментів міграції схем і ORM можуть допомогти вам запобігти накопиченню боргу з коду.

Я створив додатки, в яких ORM зберігав код програми простим, читабельним та перевіреним та мав розумні показники. Я також підтримував додатки, коли зразок був неправомірно використаний і код був складним, нестабільним, повільним та крихким; виявляється, що сам ORM мало з цим стосунок, за винятком того, що замість того, щоб писати поганий код, який погано моделював домен програми, застаріла інженерна команда написала поганий код, який погано моделював домен додатка І поганий код рівня обслуговування, який нехтував усіма значення, яке може надати їм ORM.

ORM не зробить вас розумнішими, але в руках правильного розробника, це може призвести до отримання більш корисного та якісного коду.


Я думаю, що це заплутує використання ORM як зразок для доступу до БД та ORM як фантазійний генератор коду, щоб зробити доступ до БД простішим та кращим.
gbjbaanb

Я не впевнений, що ти маєш на увазі під цим. Ваш коментар не має для мене особливого сенсу.
JasonTrue

У тому випадку, що ORM робить чудовий спосіб отримати доступ до БД з великою вагою, виконаною для вас, але якщо ви використовуєте її як модель дизайну, щоб зробити вигляд, що БД - це сукупність об'єктів, вона починає перепадати. Що я думав, ти сказав.
gbjbaanb

Я не думаю, що я ніколи не рекомендував використовувати ORM, щоб зробити вигляд, що у вас є магічний магазин об'єктів, який не вимагає від вас розуміння, як працює база даних. Я сказав прямо протилежне: Якщо ви добре розумієте об'єктно-орієнтоване програмування І як працюють бази даних, ОРМ може допомогти вам створити більш підтримуваний код.
JasonTrue

5

Можливо, відповідь полягає у зворотному запитанні: чи добре зберігати дані вашої програми в чомусь іншому, ніж реляційна база даних? Які проблеми ви усуваєте, а які інші проблеми ви вирішите обрати? Чи можете ви жити без можливості легко перехресно посилатися на ваші дані (приєднується) або швидко фільтрувати записи, які ви хочете, грунтуючись на кількох критеріях? Вам не потрібна суцільна підтримка транзакцій (якщо припустити, що у вашої альтернативи немає)? Не всі програми потребують постійного і повного сховища даних.

Я думаю, що справжній антидіапазон тут може використовувати реляційний БД, коли він вам не потрібен. Якщо він вам потрібен, то вам потрібна ORM, і це, безумовно, не є анти-зразком.


1
Я погоджуюся з тим, що використовувати реляційну базу даних, якщо вона вам не потрібна, це погана ідея, сьогодні, якщо ви використовуєте одну, вам потрібна ORM, це смішно!
HLGEM

1
Гм, то як ви збираєтеся заносити свої дані в базу даних і виходити з неї? Десь щось доведеться зіставляти ваші об’єкти в реляційній структурі та створювати їх заново, коли вони читаються з бази даних. Навіть якщо ви пишете запити вручну і копіюєте дані в набори результатів і виходите з них, ви робите ORM.
TMN

1
Використання збережених програм (єдиний прийнятний спосіб вставити будь-який вид фінансових даних з міркувань внутрішнього контролю) для здійснення всіх маніпуляцій із базою даних - це не ОРМ. Я ніколи не бачив значення ORM для того, хто фактично добре знає SQL. Я також ніколи не працював над системою (і я працюю з дуже складними додатками Enterprise), яка сильно залежала від ORM, вони просто недостатньо хороші, коли те, що ви робите, є складним.
HLGEM

6
@HLGEM: А як щодо даних, які ви отримуєте з бази даних? Коли ви запитуєте реляційну базу даних, чи не відображаєте результати на об'єкти? На мій досвід, є два типи проектів, які використовують реляційні бази даних: ті, що використовують сторонні ORM, та ті, що включають власні неякісні ORM.
Carson63000

2
+1 Карсон. Ви використовуєте якийсь ORM, незалежно від того, якщо ви просто не повернете необроблені DataSets і не зафіксуєте їх над своїм кодом (найбільш кричуще порушення всіх IMHO), оскільки вам завжди доведеться зіставляти результати цієї збереженої процедури на класи, саме це ОРМ роблять за вас.
Уейн Моліна

4

ORM - це інструмент. Як і всі інструменти, при правильному використанні вони працюють досить добре. При неправильному використанні йому потрібен більший молоток і трохи клейкої стрічки.

У випадку з поточним проектом, над яким я працюю, його підтримуватимуть не розробники (інженери-механики, якщо бути точним), і тому це потрібно бути простим і легким для того, щоб розібратися. Мине кілька років, перш ніж ця група матиме бюджет для найму розробників (припускаючи, що наступний президент не скасує залучене агентство), тому майбутні можливості обслуговування - це головний фактор у наших питаннях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.