Абстракція бази даних - це перестарається?


18

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

І це навіть не торкаючись читабельності після факту:

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

Що не так із стандартним синтаксисом SQL? Він був створений з певною метою, і він цілком відповідає цій меті. Можливо, це лише я, але я розумію фрагмент С набагато легше, ніж перші два. Перейменовані ключові слова та синтаксичні трюки милі, але IMO, коли справа доходить до цього, вони не полегшують отримання рядків для кодера.

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


2
Найбільша проблема стандартного SQL полягає в тому, що існує ряд запитів, які є специфічними для бази даних. Синтаксис зовнішнього приєднання різко змінюється, як і процес отримання "віконного" запиту. Саме з цього потрібно починати DAL. Тепер, якби був стандартний варіант SQL, використовуваний DAL, який знає, як боротися з ідіоцинкразіями різних постачальників SQL, я б вітав це.
Берін Лорич

Відповіді:


10

Найбільш фундаментальна проблема поширеного використання SQL полягає в тому, що SQL запити - це рядки, які якимось чином складені з іншої мови. Звідси беруться ін'єкції SQL та інші вразливості та WTF (ваш приклад досить погано обраний, оскільки ваш запит насправді не має жодних параметрів).

Наступна проблема насправді є наслідком: якщо у вас просто є якийсь SQL, записаний у вашому коді, компілятор нічого не може з цим зробити. Помилки, такі як помилки в назвах стовпців, з’являться лише під час виконання. Це в основному, чому ви не хочете, щоб просто рядкове представлення вашого запиту у вихідному коді, але щось, що компілятор може статично проаналізувати, щоб запобігти 95% усіх facepalm-помилок.

І остання проблема виникає, коли ви намагаєтеся зіставити реляційну базу даних для вашої мовної семантики та моделі програмування: RDBMS не дуже добре поєднуються з OOP (або пошуком навігаційних даних). Насправді, це дуже жахлива ідея, що поєднує ці дві, але це те, що стосується всіх об'єктно-орієнтованих DAL для баз даних SQL (тобто ORM). Але всі ці шари абстракції засуджені на протікання. Я думаю, що це в основному, чому їх так багато: Оскільки ви працюєте з ними, ви бачите, що вони недосконалі, ви налаштувались написати DAL, що робить це правильно і в кінцевому рахунку провалиться.

Отже, хоча проблеми однієї та другої пропонують мати DAL, які позбавляються від SQL, проблема три означає, що немає прямого рішення щодо наявності одного (принаймні для OOP), і таким чином завжди буде море DAL-ів з різними силами та обмеженнями. Зрештою, все, що ви можете зробити, це ретельно вибрати декілька і дотримуватися їх.


3
"RDBMS не добре поєднується з OOP" - чи все в програмному забезпеченні повинно бути ОО?
Quant_dev

@quant_dev: Ні. Але шари "абстракції" притаманні як мінімум "абстракційному орієнтації". Також надані фрагменти коду говорять про те, що ми говоримо про OO-код.
back2dos

Я завжди думав, що вбудовувати SQL в C або що завгодно - це лише найглупіша річ, яку можна уявити. Коли мені довелося зробити щось подібне, я створив засіб визначення зв’язків між таблицями та зберігання їх у базі даних, а потім використовував там зв’язки для створення SQL під час виконання розмови з базою даних. Мій код C був просто: "Знайдіть цю сутність за допомогою цього ключа", "Збережіть зміни до неї".

9

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


3
@Note - Але тоді DAL повинен був би мати повний SQL-аналізатор, і він повинен мати власний підтримуваний діалект, який би відрізнявся від будь-якої конкретної бази даних. І тоді це матиме всю складність, яку він наразі має, щоб створити відповідний виразник SQL, характерний для бази даних. Наприклад, ключове слово LIMIT у вашому прикладі є дійсним у MySQL, але не в Oracle або SQL Server.
Джастін Печера

2
Тепер ми переходимо до м'яса питання. Що робить нестандартний набір імен методів та перевантаження операторів перевагою нестандартного діалекту SQL? Використання SQL принаймні дасть кодеру знайомий фундамент, щоб почати вивчати рамки.
Зауважте, що самостійно - придумайте ім'я

3
@ Зауважте до себе: напевно, тому, що простіше написати вільний API стилю, ніж це написати SQL-аналізатор на якомусь діалекті SQL, а потім перекласти його на інший діалект SQL.
Дін Хардінг

1
Для запису я також вважаю за краще використовувати "рідний" SQL. Більшість моїх проектів ніколи не потребували підтримки більше ніж однієї бази даних, тому для мене це ніколи не було проблемою.
Дін Хардінг

3
"Ви не помічаєте очевидного факту, що не всі платформи баз даних приймають один і той же синтаксис SQL" - так, але як часто ви пишете код для запуску з будь-якою базою даних? Зазвичай платформа БД є вагомою інвестицією і не часто змінюється. Крім того, можна досягти значного підвищення ефективності від оптимізації запитів до відомого типу баз даних.
Quant_dev

5

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

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

Це, безумовно, дає вам перевагу, коли ви можете маніпулювати кодом доступу до даних на одному рівні та з тією ж парадигмою, яку застосовуєте під час роботи з кодом програми.

У кількох словах - спрощення, спритність, швидкість, ось цілі.


4

10 років тому Джоель написав чудову статтю: Не дозволяйте архітектурам космонавтів лякати вас

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

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


Так, компанія, над якою я працював у минулому, почала захоплено використовувати Hibernate. Потім вони виявили, якими дивними (дивним чином) можуть бути запити, породжені рамками.
Quant_dev

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