Моя довга і пізня відповідь, навіть не повна, але хороше пояснення ЧОМУ я ненавиджу цю схему, думки і навіть деякі емоції:
1) коротка версія: Active Record створює " тонкий шар " " міцної прив'язки " між базою даних та кодом програми. Що не вирішує ніяких логічних, жодних проблем, взагалі ніяких проблем. IMHO не надає жодної цінності, за винятком деякого синтаксичного цукру для програміста (який може потім використовувати "об'єктний синтаксис" для доступу до деяких даних, що існують у реляційній базі даних). Намагання створити певний комфорт для програмістів (IMHO ...) краще інвестувати в інструменти доступу до бази даних низького рівня, наприклад, деякі варіанти простих, легких, простих hash_map get_record( string id_value, string table_name, string id_column_name="id" )
та подібних методів (звичайно, поняття та елегантність сильно залежать від використовувана мова).
2) довга версія: У будь-яких проектах, керованих базами даних, де я мав "концептуальний контроль" речей, я уникав AR, і це було добре. Зазвичай я будую шарувату архітектуру (ви рано чи пізно ділите своє програмне забезпечення на шари, принаймні, на середні та великі проекти):
A1) сама база даних, таблиці, відносини, навіть певна логіка, якщо дозволяє СУБД (MySQL також дорослий зараз)
A2) дуже часто є більше, ніж сховище даних: файлова система (краплі в базі даних не завжди є хорошим рішенням ...), застарілі системи (уявіть собі "як" до них можна отримати доступ, можливе багато різновидів .. але це не суть ...)
B) рівень доступу до бази даних (на цьому рівні методи інструментів, помічники для легкого доступу до даних у базі даних дуже вітаються, але AR не надає тут ніякого значення, крім синтаксичного цукру)
C) шар об’єктів програми: "об'єкти програми" іноді є простими рядками таблиці в базі даних, але в більшості випадків вони є складними об'єктами в будь-якому випадку і мають дещо вищу логіку, тому інвестування часу в AR-об'єкти на цьому рівні просто марно втрата дорогоцінного кодеру часу, оскільки "реальну цінність", "вищу логіку" цих об'єктів потрібно реалізовувати поверх об'єктів AR, так чи інакше - з AR і без! І, наприклад, чому ви хочете мати абстракцію "Об'єктів входу в журнал"? Логічний код програми записує їх, але чи повинні вони мати можливість їх оновлення чи видалення? звучить нерозумно, і App::Log("I am a log message")
деякі величини простіші у використанні, ніжle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. І наприклад: використання "об’єкта входу в журнал" у режимі перегляду журналу у вашій програмі буде працювати для 100, 1000 чи навіть 10000 рядків журналу, але рано чи пізно вам доведеться оптимізувати - і я ставлю ставку в більшості випадків, ви просто використовуйте цей невеликий красивий оператор SQL SELECT в логіці програми (що повністю порушує ідею AR ..), замість того, щоб загортати це невелике твердження у жорсткі фіксовані рамки ідеї AR з великою кількістю коду і приховувати його. Час, який ви витратили на написання та / або створення AR-коду, можна було б інвестувати в набагато розумніший інтерфейс для читання списків записів журналів (багато, багато способів, небо - це межа). Кодери повинні наважитися вигадувати нові абстракції, щоб реалізувати свою логіку застосування, що відповідає передбачуваному додатку, а не тупо повторно реалізовувати дурні шаблони, це звучить добре з першого погляду!
Г) логіка програми - реалізує логіку взаємодіючих об'єктів та створює, видаляючи та перераховуючи (!) Об’єкти логіки програми (НІ, ці завдання рідко повинні бути закріплені в самих логічних об'єктах програми: чи говорить аркуш паперу на вашому столі ви назви та місця розташування всіх інших аркушів у вашому кабінеті? забудьте "статичні" методи перерахування об'єктів, дурний, поганий компроміс, створений для того, щоб людський спосіб мислення вписався в [якийсь не все-AR-каркас-подібний -] AR мислення)
Е) користувальницький інтерфейс - ну, те, що я напишу в наступних рядках, дуже, дуже, дуже суб'єктивно, але, на мій досвід, проекти, побудовані на AR, часто нехтують частиною програми інтерфейсу користувача - витрачали час на створення незрозумілих абстракцій . Врешті-решт такі програми витрачають багато кодерів часу і відчувають, що програми з кодерів для кодерів, технічно схильні всередині і зовні. Кодери відчувають себе добре (нарешті важка робота, все закінчено і правильно, згідно з концепцією на папері ...), а замовники "просто повинні навчитися, що це має бути таким", тому що це "професійно" .. ок, вибачте, я відволікаюсь ;-)
Ну, правда, це все суб'єктивно, але мій досвід (Ruby on Rails виключається, це може бути інакше, і я маю нульовий практичний досвід з таким підходом).
У платних проектах я часто чула вимогу почати зі створення деяких об'єктів "активного запису" як складового елемента для логіки додатків вищого рівня. На мій досвід, це помітно частобуло певним приводом для того, що у замовника (компанії, що розробляє програмне забезпечення в більшості випадків) не було хорошої концепції, великий погляд, огляд того, яким повинен бути продукт. Ці замовники думають у жорстких кадрах ("у проекті десять років тому він працював добре."), Вони можуть згуртовувати сутності, вони можуть визначати відносини між сутностями, вони можуть порушувати відносини даних та визначати базову логіку програми, але тоді вони зупиняються і передайте це вам, і подумайте, що все, що вам потрібно ... їм часто не вистачає повної концепції логіки програми, користувальницького інтерфейсу, зручності використання тощо, і так далі ... їм не вистачає великого погляду, і їм не вистачає любові до деталі, і вони хочуть, щоб ви дотримувались цього способу AR, тому що ... ну чому ж він працював у тому проекті років тому, він тримає людей зайнятих і мовчазних? Не знаю. Але "подробиці" відокремити чоловіків від хлопців, або .. як було оригінальним слоганом реклами? ;-)
Через багато років (десять років активного досвіду розробки) кожен раз, коли клієнт згадує про "активну схему запису", дзвонить мій сигнал тривоги. Я навчився намагатися повернути їх до тієї суттєвої концептуальної фази , нехай подумають двічі, спробують показати свої слабкі уявлення або просто взагалі уникати їх, якщо вони нерозбірливі (врешті-решт, ти знаєш, замовник, який ще не робить цього знаю, що хоче, може, навіть думає, що знає, але ні, або намагається зовнішньо працювати з концепцією для мене безкоштовно, коштує мені багато дорогоцінних годин, днів, тижнів і місяців мого часу, жити занадто коротко ...)
Отже, нарешті: ЦЕ ВСЕ, чому я ненавиджу цей нерозумний "активний шаблон запису", і роблю і уникатиму його, коли це можливо.
EDIT : Я б навіть назвав це відсутнім зразком. Це не вирішує жодної проблеми (шаблони не призначені для створення синтаксичного цукру). Це створює багато проблем: корінь усіх його проблем (про які згадується в багатьох відповідях тут ..) полягає в тому, що він просто приховує старий добрий добре розвинений і потужний SQL за інтерфейсом, який за визначенням шаблонів надзвичайно обмежений.
Ця модель замінює гнучкість синтаксичним цукром!
Подумайте, яку проблему вирішує AR для вас?