Що б ви думали про новий інструмент збереження Java, це насправді не ORM? [зачинено]


12

Наполегливість на Яві

Протягом останніх років я збирав досвід у галузі стійкої абстракції на Java, використовуючи такі поняття, як EJB 2.0, Hibernate, JPA та домашні вироби. Мені здавалося, що у мене крута крива навчання та багато складності. Крім того, як великий шанувальник SQL, я також вважав, що багато моделей абстракції забезпечують занадто велику абстракцію над SQL, створюючи такі поняття, як "критерії", "предикати", "обмеження", які є дуже хорошими поняттями, але не є SQL.

Загальна ідея стійкості абстракції на Java, здається, базується на об'єктно-реляційній моделі, де RDBMS якось узгоджується зі світом OO. Дебати щодо ОРМ завжди були емоційними, оскільки, здається, не існує єдиного рішення, яке підходить усім - якщо таке рішення навіть може існувати.

jOOQ

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

  • Мова домену, заснована на SQL
  • Генерація вихідного коду відображає основні схеми бази даних на Java
  • Підтримка багатьох RDBMS

Додавання деяких функцій, які мають декілька сучасних інструментів збереження (виправте мене, якщо я помиляюся):

  • Підтримка складних SQL - об'єднань, вкладених вибірок, самостійних приєднань, псевдоніму, випадок, арифметичні вирази
  • Підтримка нестандартних SQL - збережених процедур, UDT, ENUMS, нативних функцій, аналітичних функцій

Будь ласка, ознайомтесь із сторінкою документації для отримання більш детальної інформації: http://www.jooq.org/learn.php . Ви побачите, що дуже схожий підхід реалізований у Linq для C #, хоча Linq не розроблений виключно для SQL.

Питання

Тепер, сказавши, що я великий шанувальник SQL, мені цікаво, чи поділяться інші розробники моїм захопленням jOOQ (або Linq). Чи такий підхід до стійкої абстракції є життєздатним? Які переваги / недоліки ви можете бачити? Як я міг покращити jOOQ, а чого не вистачає на вашу думку? Де я помилився, концептуально чи практично?

Критичні, але конструктивні відповіді високо оцінені

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


Чи обробляє операції?
Арман

@Alison: Ні, мова йде лише про SQL. Обробка транзакцій - це дуже складний бізнес, на який я думаю, що багато інших інструментів / рамок (включаючи EJB2 / 3) справляться краще, ніж jOOQ
Лукаш Едер,

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

Також зауважте, що редагування ЦЬОГО важкого зробить відповіді більш-менш неактуальними та, отже, непридатними для майбутніх читачів. Задайте замість цього нове, і краще, питання.

Привіт Торбьорн. Ви маєте на увазі регістр використання, відмінний від показаного на сторінці прикладів? Або ви хочете побачити кілька прикладів у самому питанні? Про редагування: ти взагалі правий. У цьому випадку, однак, я думав, що дві відповіді, які я отримав до цього часу, були б дещо однаковими ...
Лукаш Едер

Відповіді:


5

Я думаю, що ви на правильному шляху і маєте продовжувати своє рішення. Деякі попередні критики надто суворі, але деякі вагомі моменти.

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

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

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

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

Ваше рішення краще уточнює проблему, але воно вирішує лише її частину. Я думаю, що шаруватий підхід може дати нам все, що ми хочемо. Те, що ви придумали / IMO, - це основний шар. Як ви вже запропонували, я думаю, що цей шар найкраще автоматично генерувати на основі схеми бази даних. Це повинна бути дуже проста реляційна модель об'єкта, яка відображається безпосередньо на базі даних і не більше. Ви праві, що дані зберігаються набагато довше, ніж код, тому на цьому рівні дані повинні керувати кодом, а не навпаки. Він підтримує CRUD, а також ефективний масовий запит. Я, мабуть, реалізував би якийсь кеш L1 на цьому шарі.

Однак, чим відрізняються інші рішення ORM, це здатність визначати ваші об'єкти таким чином, що не так сильно залежить від фактичної структури базової бази даних. Для цієї функціональності я створив би ще один шар. За необхідності цей шар стає більш абстрактним, сподіваємось, простішим (за рахунок втраченої функціональності) та будується на попередньому шарі. Він може використовувати кеш L2.

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

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


Привіт Дейл, дякую за заохочення! Мені подобається, що ви фразуєте про шари, а jOOQ знаходиться на найнижчому шарі з можливою подальшою абстракцією зверху jOOQ. З цим я хочу зайнятися, коли в мене достатньо імпульсу з jOOQ. Взаємодія з JPA та / або сплячим режимом очевидно буде в дорожній карті. Як висловлюєтесь, ці інструменти відрізняються простотою через абстрагування і мають багато можливостей, яких я не хочу в своєму шарі: транзакції, сеанси, кеші L2 тощо. PS: Чи є ваше власне рішення у відкритому доступі? Мені було б дуже цікаво!
Лукаш Едер

8

"Там багато магічних куль, і наївних розробників немає."

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


1
Дякуємо за ваш відгук! У вас був більш глибокий погляд на мою бібліотеку? Я точно намагаюся «відмовитися від O», як це називає ваша стаття. jOOQ хоче, щоб розробники писали код SQL, а не АБО Mapped. Я намагаюся досягти того, що Linq робить для .NET, не маючи змоги переписати компілятор Java. Вітаємо Microsoft за Linq! І я смію сказати, що я не наївний, тому що я створив jOOQ після того, як я не був задоволений EJB 2.0 (досить давно), ні зі сплячим режимом. Саме з причин, які ви вказуєте у своїй статті. Я спробував те, що було зроблено, і це не відповідало моїм потребам.
Лукас Едер

jOOQ хоче, щоб розробники використовували ваш API, подібний критеріям. Це не SQL. Це спосіб створити SQL, який насправді є гіршим і складнішим, ніж SQL з дуже невеликою, якщо такою є, реальною вигодою. "q.addCompareCondition (TAuthor.YEAR_OF_BIRTH, 1920 р., компаратор.GREATER);" Я не бачу нічого по-справжньому відмінного від будь-якого іншого інструменту генерації класу за столом. Що означає, як я вже сказав, є майже певна ймовірність того, що краща вже існує. Створені шаблонами рядкові поля навіть не наближаються до того, що дозволяють лямбда-вирази.
квентин-зірин

1
Мені трохи складно зрозуміти мотивацію, що стоїть за вашою відповіддю / коментарем. Я все ще думаю, що ви не мали ретельного ознайомлення з наведеними нами прикладами (ви цитували перший приклад), і ваше порівняння з конкуруючими продуктами мені здається дещо невиразним. Суть мого питання полягала в тому, щоб отримати конструктивні відгуки, і я би вдячний саме тому. Ви згадуєте "кращі інструменти" та "лямбда-вирази". Чи можете ви, будь ласка, докладно? Як jOOQ порівнюється із згаданими вами інструментами? Як реалізуються лямбда-вирази в Java 6 - перш ніж Oracle може додати їх у Java 8? Ще раз дякую
Лукаш Едер

2

Один зі сценаріїв, який би зробив цей API дуже підходящим, коли вам потрібен конструктор SQL-агресивних баз даних, який більшість ORM не дозволяє вам мати. Одна велика ситуація, коли мені це було потрібно - це створення звітів. Мені потрібно було побудувати SQL об'єктно-орієнтованим способом і збираюся запускати цю sql на різних базах даних для тестування. Зимова сплячка та інші ORM дуже залежать від конфігурацій, таким чином обмежуючи мою конструкцію sql таким чином, що я не можу поєднувати таблицю там, де асоціація не існує в xmls. Оскільки в модулі звітів, який я розробляю, можлива будь-яка асоціація, я шукав щось інше. Потім я натрапив на JOOQ. Це просто вирішує мою проблему. Мені просто потрібен доступ лише для читання, ніколи не стикаюся з болісними проблемами налагодження, як у сплячому режимі.

Я фактично планую розробити інший спосіб моделювання даних, а не загальний спосіб POJO і використовувати JOOQ як один із фундаментів, що є шаром для побудови SQL. Отже, поверх JOOQ, я планую створити більш гнучкий спосіб моделювання даних / сутностей за допомогою HashMaps. Моя конструкція дозволила б простіше інтегрувати дизайн переднього кінця та бекенда в одну точку входу, хоча я б використовував різні шари для завершення рамки, як і те, що було сказано вище. JOOQ дійсно зіграє дуже гарну роль, як у моєму власному проекті, він служить одним із фундаментів або стовпів.

Тож продовжуйте гарну роботу луки!


1

Якщо я правильно розумію ваш інструмент, він відображає об'єкти безпосередньо в концептуальній структурі SQL, а не відображає об'єкти, які реалізують деяке відображення у функціональність SQL (ORM), майже як ORM - абстракція для більшого видовищного контролю, щоб ви могли використовувати більше функцій SQL ORM зазвичай не дасть вам?

Не впевнений, яку проблему ви намагаєтеся вирішити. Оскільки ваш інструмент вимагає поглибленого знання SQL, чи не просто люди користуватимуться, ну, SQL? Це клей-код, якого ви намагаєтеся позбутися? Краща перевірка запитів SQL за допомогою моделювання API замість простих рядків?

Я мушу визнати, що ваші приклади JOOQ виглядають як LISP-версії SQL. Не те, що це погано :) І я бачу, що деякі передові речі цікаві, але переваги, які ви перераховуєте, повільно зникають, коли ви стаєте все більш вдосконаленими (більш конфігурація, менш абстрактна, більш вбудована у внутрішню святиню конкретного SQL двигун тощо)

Одне із пропозицій, я хотів би побачити, що я пропускаю в більшості ORM - це структура, яка може обробляти об'єкти нереляційним способом, переводячи взаємодії об'єктів у будь-який сервіс (SQL, NoSQL, Maps Topic, RDF тощо). .), що вимагає кешування використовуваної моделі, а не специфіки взаємодій SQL, діалектів та реляційного мислення.

ІМХО, звичайно. :)


Привіт, дякую за відгуки. Ви правильно зрозуміли. Як сказав qstarin, я намагаюся видалити "O" з ORM і залишатися реляційним. Чому б не звичайний SQL? Ви маєте на увазі JDBC? Ви коли-небудь запитували вашу базу даних з 5 вкладеними селекторами та кількома об'єднаннями, аналітичними функціями з JDBC? Помилки синтаксису, невідповідність зв’язку тощо. На жаль, jOOQ не може бути правильним інструментом для вас, оскільки немає можливості зіставити будь-яку модель на об'єкти. І я цього не хочу. jOOQ ПОВИНЕН бути реляційним. Для тих розробників, які вважають за краще такий спосіб мислення. Для інших я рекомендую JPA .. Або Linq, якщо ви робите .NET
Лукас Едер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.