Чому немає любові до SQL? [зачинено]


116

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

На моєму досвіді, SQL часто є набагато простішим, універсальнішим та зручнішим для програмування способом управління введенням та виведенням даних. Кожен шар абстрагування, який я використовував, здається, є досить обмеженим підходом і не має реальної користі.

Що робить SQL таким жахливим і чому цінні шари абстракції баз даних?


11
як щодо безпеки типу?
johnny

3
На кого саме спрямовані ці шари абстракції? SQL не є мовою, на якій всім добре, і тому вони можуть бути націлені на посередніх програмістів. Сам SQL зовсім не є гарною мовою для непрограміста.
Девід Торнлі

27
@ Девід: Визначте (комп’ютерну) мову, що "добре для непрограміста". Непрограмісти, IMHO, повинні триматися подалі від мов програмування (і в ширшому значенні цього слова, SQL).
DevSolar

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

6
@KM: Проблема з голосами полягає в тому, що вони значно залежать від кількості людей, які читають відповідь. Я відповів на багато запитань NHibernate та Rhino Mocks, на які потрібен певний час, щоб відповісти правильно - і був прийнятий, але ні одного голосу. Якщо ви відповісте на щось тривіальне про C #, ви отримаєте десятки голосів. Голоси просто не чесні. Запропонуйте щось на meta.stckoverflow, якщо ви знаєте щось краще.
Стефан Штейнеггер

Відповіді:


132

Частково це суб'єктивно. Отже, це моя думка:

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

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

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

SQL дуже старий . SQL був стандартизований, але занадто пізно, багато постачальників уже розробили свої розширення мови. Так SQL опинився в десятках діалектів. Ось чому програми не є портативними і одна з причин мати рівень абстрагування БД.

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


31
"Просто вкажіть, що ви хочете - ми доставляємо якнайшвидше". Цей декларативний підхід є фантастичним, і він насправді сучасний (подумайте LINQ). Це правда, інколи потрібно налаштувати швидкість, і тоді може бути корисна процедурна альтернатива SQL. Але я все одно використовую декларативний SQL більшість часу для простоти.
MarkJ

4
MarkJ: Я пам'ятаю, що я упорядкував пункти WHERE для оптимізації запитів в Oracle. Вони там, де вирішені знизу до верху ... страшно.
Стефан Штейнеггер

16
Я згоден повністю. ІТ-люди захоплюються непроцедурними інструментами. Хіба це не було б набагато простіше, якби ви просто сказали комп'ютеру, що ви хочете, і він з'ясував, як це зробити! Так, якби комп'ютер був насправді досить розумним для цього. Але це не так. Мені б хотілося, якби я міг просто сказати своєму автомобілю "Возьми мене до бабусі", і воно загнало б мене туди. Але це не так, тому я не просто відпускаю кермо і роблю вигляд, що це спрацює. Можливо, коли-небудь технології будуть там, або, можливо, це неможлива мрія. Але його сьогодні немає. (продовження ...)
Джей

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

5
@Jay та інші сумніви у SQL. У моєму досвіді проблема полягає в тому, що для ефективного використання SQL вам потрібно вміти мислити з точки зору наборів, а не процедурно - саме тому більшість програмістів вчать думати. Ефективне використання SQL насправді не так вже й складно в межах досяжності будь-якого компетентного кодера (як і будь-хто, хто читає ТАК!), Але потрібно докласти зусиль, щоб перейти до мислення за заданою логікою, і значну частину часу люди роблять Я не турбуюсь (і я зараз вношу зміни до програми, де оригінальний кодер зробив усе, використовуючи курсори саме з цієї причини)
Cruachan

58

Крім усього сказаного, технологія не повинна бути поганою, щоб зробити шар абстракції цінним .

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

SQL - це чудово. Шари абстракції над нею роблять ще більше!


6
Дуже дипломатичний! (І правда, до завантаження!)
Джозеф Ферріс

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

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

53

Одним із пунктів абстракційних шарів є той факт, що реалізація SQL, як правило, є більш-менш несумісною між собою, оскільки стандарт трохи неоднозначний, а також тому, що більшість постачальників додали там свої (нестандартні) додатки. Тобто, SQL, написаний для БД MySQL, може не працювати аналогічно, скажімо, з Oracle DB - навіть якщо це "повинно".

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


19
Я не розумію, наскільки несумісність діалектів SQL може бути такою величезною "точкою" щодо SQL. Це як би сказати, що C - це лайно, оскільки ви не можете просто компілювати + запускати одне і те ж джерело в різних дистрибутивах Linux. Якщо і це велике, якщо ваша компанія вирішує переключити постачальників баз даних, це рідкісне і велике явище, яке має більше рухомих частин, ніж просто переписування деяких SQL.
Jeff Meatball Yang

7
Це не точка проти SQL, це точка для шарів абстракції. Мовляв, ви не можете просто компілювати + запускати один і той же код C де завгодно, це крапка для небайдужих мов платформи. Але це не робить SQL і C "лайно": шари абстракції все одно проходять поверх глибших шарів.
Joonas Pulakaka

8
@Jeff: У C загальні завдання є частиною стандарту. У SQL неможливо застосувати набір результатів без попадання в конкретний постачальник SQL.
Powerlord

4
О, і про рідкість перемикання постачальників баз даних: про що ти говориш? Чи рідкість компанії, що перемикає операційні системи, робить кросплатформенні рішення неактуальними? Ви не завжди заздалегідь знаєте, на чому буде запущений ваш продукт, тому краще помилитися з більш загальними рішеннями.
Joonas Pulakaka

3
@Joonas: Я думаю, я мав на увазі сказати, що мова (-ів) SQL не є проблемою. Питання, що робить SQL таким жахливим, і моя початкова реакція, як і ваша, полягає в тому, що це не так. Але я хотів стверджувати, що розміщення різних діалектів насправді не є сутністю ORM - ми мали б їх, навіть якби у нас була лише одна стандартна мова - я думаю, що нам більше потрібен спосіб розв'язати нормалізовані дані до OO-моделі.
Jeff Meatball Yang

36

SQL отримує пошкодження з кількох джерел:

  • Програмісти, яким нічого не влаштовує, окрім обов'язкової мови.
  • Консультанти, яким доводиться щодня стикатися з багатьма несумісними продуктами на базі SQL
  • Постачальники нереляційних баз даних намагаються зламати перешкоду постачальників реляційних баз даних на ринку
  • Експерти з реляційних баз даних, як Кріс Дата, вважають поточні реалізації SQL недостатніми

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

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

Якби вони серйозно ставились до критики самого SQL, вони б підтримали зусилля на зразок Підручника D та Dataphor.


7
Щодо першого пункту про програмістів, що їм не подобається нічого, крім обов'язкової мови. Протягом наступних кількох років буде цікаво дізнатись, чи / як відродження функціонального програмування має на цьому значення. На сьогоднішній день існує багато шуму щодо таких мов, як Haskell, F # та Scala, що робить розробників набагато продуктивнішими. Цей тип "математичного" мислення для програмістів дуже схожий на знання реляційної алгебри та кортежного реляційного числення, яке SQL попередньо передбачає. Можливо, буде час відродження нативного мислення, заснованого на SQL!
Тревор Тіппінс

Я повинен уточнити, що я мав на увазі "тих програмістів, які не задоволені нічим, крім імперативного програмування", а не тим, що всі програмісти з цим незручні.
Стівен Ювіг

+1, добре сказано. І як хтось, хто провів там перші кілька років як професійний кодер у дорелейній базі даних, я вважаю відверто приголомшливим, що хтось хоче повернутися в ту епоху, крім спеціалізованих завдань. Дня, витраченого на написання коду, що переглядає структуру дерева DL / 1, має бути достатньо, щоб когось переконати.
Круачан

Проблема полягає в тому, що є багато нав'язливих програмістів, які скоріше вибивають кілька сотень рядків невмілого коду, а не думають про речі протягом години.
Стівен Гувіг

Вам не доведеться думати про речі протягом години, щоб написати або зрозуміти кілька рядків коду. Період.
Андрій

23

Це не так страшно. Невдала тенденція в цій галузі сміття попередньої надійної технології, коли з'явиться нова "парадигма". Зрештою, ці рамки, швидше за все, використовують SQL для спілкування з базою даних, то як це може бути БУДЬ поганим? Однак, "стандартний" рівень абстракції означає, що розробник може зосередитись на коді програми, а не на SQL-коді. Без такого стандартного шару ви, мабуть, пишете легкий кожен раз, коли розробляєте систему, що марно витрачає зусилля.


16

SQL призначений для управління та запиту даних на основі SET. Його часто використовують для того, щоб робити більше, а крайові випадки часом призводять до розладу.

Фактичне використання SQL може вплинути на базовий дизайн бази даних, що SQL може не бути проблемою, але дизайн може бути - і коли ви кидаєте застарілий код, пов’язаний з поганим дизайном, зміни є більш впливовими та дорогими, що потребують невдалого ( ніхто не любить повертатися назад і «виправляти» речі, які «працюють» і відповідають цілям)

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


11

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

SQL був розроблений для реляційної алгебри - саме там її слід використовувати.


2
Прикро, що дуже спокусливо просто вставити якийсь простий процесуальний код у збережену процедуру. І це чудово працює. Доки комусь потрібно підтримувати його / додавати деякі винятки тощо ...
Brian Knoblauch

5
-1, помилка, саме в цьому суть, SQL розроблений так, щоб він був заснований і в цьому полягає сила. Мислення в процедурному плані означає, що ви думаєте неправильно.
Круачан

1
Ця викрутка смокче! Так важко загризати в нігті.
Кейсі Родармор

9

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

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

На моєму досвіді, SQL часто є набагато простішим, універсальнішим та зручнішим для програмування способом управління введенням та виведенням даних. Кожен шар абстрагування, який я використовував, здається, є досить обмеженим підходом і не має реальної користі.

... причина, з якої я щойно описаний вище.

Шари бази даних нічого не додають , вони просто обмежують вас. Вони роблять запити суперечливо простішими, але ніколи не більш ефективними.

За визначенням, у шарах бази даних нічого не є SQL.

Що робить SQLтак жахливим і чому цінні шари абстракції баз даних?

SQL це приємна мова, однак для роботи з цим потрібен певний поворот мозку.

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

На практиці існує багато способів сформулювати правильний запит (тобто запит, який повертає правильні результати).

Оптимізатори здатні створити замок Лего з деяких заздалегідь заданих алгоритмів (так, їх багато), але вони просто не можуть створити нові алгоритми. Все ще потрібно SQLрозробнику, щоб допомогти їм.

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

І як ми всі знаємо, коли комп’ютерна програма не відповідає очікуванням людей, це стає виною саме програма, а не очікування.

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

Хоча було б добре, якби постачальники надавали доступ низького рівня до функцій на кшталт "отримати діапазон індексу", "отримати рядок rowid" тощо, як Cкомпілятори дозволяють вбудовувати збірку прямо на мову.

Я нещодавно написав статтю про це у своєму блозі:


7

Я величезний захисник ORM, і я все ще вважаю, що SQL дуже корисний, хоча з цим, звичайно, можна робити жахливі речі (як і все інше). .

Я розглядаю SQL як надзвичайно ефективну мову, яка не має повторного використання коду або ремонту / рефакторингу як пріоритетних.

Тож блискавична обробка - це пріоритет. І це прийнятно. Ви просто повинні бути обізнані про компроміси, які для мене значні.

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


7

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

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

  2. Багато програмістів просто погано користуються SQL. З будь-якої причини, велика кількість розробників (особливо веб-розробників), здається, дуже і дуже погано використовує SQL або RDBMS. Вони розглядають базу даних (і SQL за допомогою розширення) як хмурий маленький посередник, через який вони мають пройти, щоб дістатися до даних. Це призводить до вкрай погано продуманих баз даних без індексів, таблиць, складених вгорі таблиць із сумнівними способами, і дуже погано написаних запитів. Або ще гірше, вони намагаються бути надто загальними (Експертна система, хтось?) І не можуть обґрунтовано співвідносити дані в будь-якому значущому плані.

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


6

SQL відмінно підходить для виконання певних завдань, особливо для маніпулювання та отримання наборів даних.

Однак у SQL бракує (або частково реалізується) декілька важливих інструментів управління змінами та складністю:

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

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

  • Контроль видимості : не існує стандартного механізму SQL для приховування фрагментів коду один від одного або групування їх у логічні одиниці, тому кожна таблиця, процедура тощо доступна для всіх інших, навіть коли це небажано.

  • Модульність та версія

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

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


А як щодо схем контролю видимості?
Три логіки цінності

5

SQL базується на теорії задань, тоді як більшість мов високого рівня є об'єктно орієнтованими в наші дні. Об'єктні програмісти, як правило, люблять думати над об'єктами, і їм доводиться робити ментальний зсув, щоб використовувати інструменти на основі встановлених програм для зберігання своїх об'єктів. Як правило, набагато природніше (для програміста OO) просто вирізати код мовою, яку вони обрали, і зробити щось на зразок object.save або object.delete в коді програми, замість того, щоб писати запити sql і викликати базу даних для досягнення той же результат.

Звичайно, інколи для складних речей SQL простіший у використанні та ефективніший, тому добре мати ручку обох типів технології.


5

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

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


4

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


2
Щоправда, але для цього вам не потрібна
ОРМ

2
Використання параметризованих запитів є дрібницею при безпосередньому записі SQL за умови, що у вас є гідний рівень інтерфейсу бази даних (тобто такий, який підтримує заповнювачі). $dbh->do("DELETE FROM my_table WHERE some_value = ?", undef, $target_value); Там. Зроблено.
Дейв Шерохман

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

2
Правда, але уникнути ін'єкції SQL тривіально просто навіть без підготовлених заяв. У кожному проекті, який я роблю, я пишу просту функцію, яка ставить лапки навколо рядка і правильно уникає будь-яких вбудованих лапок. На написання потрібно близько п’ятнадцяти хвилин, навіть якщо я не копіюю її з попереднього проекту. Тоді я використовую це для кожного буквального вкладеного запиту. Мені притаманне враження - це те, що програмісти цього не роблять! Не потрібно п’ятнадцять хвилин, щоб уникнути навмисного або - можливо, більш поширеного - випадкового введення SQL! Чому ні?!
Джей

3
Джей, чи "проста функція, яка ставить лапки навколо рядка і правильно уникає будь-яких вбудованих лапок", враховує поточний набір символів, який використовується на сервері?
ygrek

4

Чув багато останнім часом? Сподіваюся, ви не плутаєте це з рухом NoSql. Наскільки мені відомо, що це в основному купа людей, які використовують NoSql для веб-додатків із високою масштабованістю і, здається, забули, що SQL є ефективним інструментом у сценарії, що не стосується веб-додатків із високою масштабованістю.

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


4

Для досвідченого програміста SQL погані сторони

  • Багатослівність
  • Як багато хто казав тут, SQL є декларативним, що означає, що оптимізація не є прямою . Це як ралі в порівнянні з гоночними трасами.
  • Рамки, які намагаються вирішити всі можливі діалекти та не підтримують ярлики жодного з них
  • Немає простого управління версіями.

Для інших причини такі

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

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

[оновлення 26.06.10] Нещодавно я працював з модулем Django ORM . Це єдина гідна рамка SQL, яку я бачив. І це робить багато з роботою з речами. Однак складні агрегати трохи складніше.


3

SQL не є страшною мовою, іноді просто не дуже добре грає з іншими.

Наприклад, якщо у вас є система, яка хоче представляти всі сутності як об'єкти в певній або іншій мові OO, то поєднання цього з SQL без будь-якого шару абстракції може стати досить громіздким. Немає простого способу зіставити складний SQL-запит у світі OO. Щоб полегшити напругу між цими світами, вставляються додаткові шари абстракції (наприклад, АБО-Mapper).


чому винна SQL, що мови OO не відповідають їй? Коли ви користуєтесь послугою, відповідайте її інтерфейсу або не використовуйте його.
КМ.

2
Ніхто не сказав, що це вина SQL. Франкова мова DB-доступу - це SQL. Лінгва франка ділової логіки - заснована на ОО. Ці двоє не відповідають ідеально без допомоги. Тут немає жодних "помилок" або "проблем", лише деякі вимоги ("зробіть їх відповідністю") і широко прийняте рішення ("використовувати OR-Mapper").
Йоахім Зауер

Йоахім Зауер сказав, що SQL не є страшною мовою, він просто не дуже добре грає з іншими. Мені це здається так, що хтось сказав, що це вина SQL
KM.

1
@KM: Ви кажете, що французька та німецька мови - це погані мови? Вони не так добре грають з англійською.
Девід Торнлі

3

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

Інша причина, чому SQL ненавидять, - це реляційні бази даних.

CAP Теорема стає популярним:

Які цілі ви можете отримати від системи спільних даних?

  • Сильна послідовність: усі клієнти бачать однаковий вигляд навіть за наявності оновлень
  • Висока доступність: всі клієнти можуть знайти репліку даних, навіть за наявності відмов
  • Толерантність до розділів: властивості системи зберігаються навіть тоді, коли система є розділеною

У теоремі зазначається, що завжди можна мати лише два з трьох властивостей CAP одночасно

Адреса реляційної бази даних Сильна консистенція та толерантність до розділів.

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

Якщо реляційна база даних відхилена, SQL також відхилений.


3

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

Моя теорія полягає в тому, що SQL була винайдена купою синіх лижників-башток із слонової кістки. Вся непроцедурна структура. Звучить чудово: скажи мені, що ти хочеш, а не як ти хочеш це зробити. Але на практиці часто простіше просто робити кроки. Часто це здається спробою дати інструкції з технічного обслуговування автомобіля, описуючи, як повинен працювати автомобіль, коли закінчите. Так, ви можете сказати: "Я хочу, щоб машина знову отримала 30 миль на галон, і бігала з таким гудінням, як цей ... хммм ... і т. Д." Але хіба не було б легше всім просто скажіть: «Замінити свічки запалювання»? І навіть коли ви зрозумієте, як висловити складний запит у непроцедурних умовах, двигун бази даних часто складається з дуже неефективним планом виконання, щоб потрапити туди.

І поводження з нулями зводить мене з розуму! Так, теоретично це повинно було звучати чудово, коли хтось сказав: "Ей, якщо null означає невідоме, то додавання невідомого значення до відомого значення має дати невідоме значення. Зрештою, за визначенням ми не маємо поняття, що таке невідоме значення" . " Теоретично абсолютно вірно. На практиці, якщо у нас є 10 000 клієнтів і ми точно знаємо, скільки грошей заборгували нам 9 999, але виникає питання щодо суми заборгованості за останній, а керівництво каже: "Яка загальна дебіторська заборгованість?", Так, математично правильно відповідь "я не знаю". Але практична відповідь - "ми обчислюємо $ 4,327,287.42, але один рахунок знаходиться під питанням, тому число не є точним". Я впевнений, що керівництво швидше наблизиться, якби не певна кількість, ніж порожній погляд.

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


3
Вся ідея реляційних баз даних була продуктом блакитних скверів із слонової кістки. Ранні реляційні бази даних мали жахливі показники порівняно з тодішніми ієрархічними базами даних, і це зайняло тривалий час, щоб їх встановити. Сила абстрагування була такою, що ієрархічні бази даних є по суті справою минулого (не те, що там все ще немає ймовірних баз даних IMS та CODASYL). Це мало працювати дуже-дуже добре.
Девід Торнлі

1
Але керівництво не побачило б "близьке, якщо не певне число" - вони побачать неправильне число. Можливо, цей кінцевий замовник заборгував багато грошей. Тоді керівництво було б дуже незадоволене тим неправильним числом.
HTTP 410

RoadWarrior: Так, можливо, у вас є 10000 клієнтів, котрий кожен вам зобов’язаний 10 та 1 клієнт, який заборгував вам 10 мільйонів доларів. Але якщо це було так, кожен, хто запитував AR-звіт, швидше за все, знатиме ім'я клієнта дуже добре і точно знатиме, що з ними відбувається. Гаразд, я впевнений, що бувають випадки, коли жодна відповідь не є кращою, ніж відповідь, настільки недостовірна, що є безглуздою. Але це моя думка: SQL розроблений на основі таких теоретичних міркувань: догматичний "нічого меншого, ніж досконалість, нічого не варте". ...
Джей

... У реальному житті в 95% часу приблизна відповідь набагато краща, ніж пустий погляд. Переглядаючи свою чекову книжку, я знаю, що цілком можливо, що я зробив арифметичну помилку або забув написати в чеку. Баланс цілком може бути приблизним. Але все-таки, якщо я знаю, що у мене є "близько 1000 доларів", у мене не буде ніяких труднощів щодо написання чека за 50 доларів, і я усвідомлю, що написання чека на 10 000 доларів буде марним.
Джей

Ну, я вела бізнес, і це ніколи не 10 К проти 1. IMX, це більше схоже на 20 невідомих на кожні 100 відомих (принцип парето). А деякі з цих 20 заборгували нам чималі гроші, саме тому фактична сума суперечилася. Знову ж таки, це принцип парето.
HTTP 410

3

• Кожен постачальник розширює синтаксис SQL відповідно до своїх потреб. Тому, якщо ви робите досить прості речі, ваш SQL-код не є портативним.

• Синтаксис SQL не є ортогональним; наприклад, select, insert, update,і deleteвсі твердження мають абсолютно різну синтаксичну структуру.


1
Як це робить синтаксис не ортогональним?
Амок

1
Мова могла бути розроблена так, що всі ці імперативні висловлювання мають більш загальний синтаксис, особливо між операціями insertта updateопераціями, які майже однаково семантично, але синтаксично абсолютно різні.
David R Tribble

2

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


2
Я не розумію, наскільки несумісність діалектів SQL може бути такою величезною "точкою" щодо SQL. Це як би сказати, що C - це лайно, оскільки ви не можете просто компілювати + запускати одне і те ж джерело в різних дистрибутивах Linux.
Jeff Meatball Yang

1
@Jeff: Насправді я не думаю, що це величезна суть проти SQL. Ось чому я сказав «я згоден з вашими пунктами» і поставив «страшне» в лапках. Сам я віддаю перевагу SQL над шарами абстрагування даних, хоча радий, що такі речі, як NHibernate, існують, тому що вони набагато кращі, ніж домашні лайно, які раніше розмножувалися.
MusiGenesis

1
Правда - я також використовую шари абстракції - я думаю, я мав на увазі сказати, що для мене мова SQL не є проблемою - це перетворення нормалізованих даних в об'єкти, саме тому шари абстракції корисні.
Jeff Meatball Yang

2

Життя з чистим SQL може насправді бути пеклам обслуговування. Для мене найбільшою перевагою ORM є можливість безпечного рефакторного коду без набридливих процедур "рефакторингу БД". Є хороші рамки тестування підрозділів та інструменти рефакторингу для мов OO, але мені ще належить побачити, наприклад, аналог Resharper для SQL.

Проте всі DAL мають SQL за лаштунками, і все одно вам потрібно це знати, щоб зрозуміти, що відбувається з вашою базою даних, але щоденна робота з хорошим шаром абстракції стає простішою.


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

2

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

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


2

Швидко напишіть мені SQL, щоб застосувати пакунок набору даних, який працює в MySQL, Oracle, MSSQL, PostgreSQL та DB2.

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


5
Чому ви намагаєтесь націлити на ці всі середовища своїм кодом? Напишіть мені код C для тем, що працює в Mac OS 9, Windows NT, OS / 2 Warp та Solaris.
Стівен Ювіг

2
@Steven Huwig: Я б, мабуть, використовував шар абстракції, щоб зробити це для мене ... саме про це і ставилося запитання.
Powerlord

@Steven: Мені трапляється використовувати рамки та шари абстракції для багатьох речей, де мені потрібно бути незалежними від платформи. Однак незалежність бази даних є набагато важливішою у більшості випадків. Навіть якщо ви постачаєте лише своє програмне забезпечення для запуску в Windows, після того, як ви отримаєте його продати більшим корпораціям, ви збираєтеся зіткнутися з усім: "Ми віддаємо перевагу ОС, чи підтримуєте ви MySQL" до "Ми використовуємо Oracle | MSSQL | як би там не було корпоративний стандарт, чи підтримуєте ви його ".
Фредрік

2

Немає любові до SQL, оскільки SQL поганий у синтаксисі, семантиці та поточному використанні. Я поясню:

  • це синтаксис - шрапнель коболів, тут застосовується вся критика коболів (меншою мірою, щоб бути справедливою). Намагаючись бути природною мовою, як насправді, не намагаючись інтерпретувати природну мову, створює синтаксис арбітражної ситуації (чи це ВИДАЛЕННЯ ТАБЛИЦІ, ПІДГОТОВКА, ОНОВЛЮВАННЯ ТАБЛИЦІ, ОНОВЛЕННЯ або ОНОВЛЕННЯ В, ЗВІДКУЙТЕСЬ або ВИДАЛИТИ ЗІ ...) та синтаксичні жахливості на зразок SELECT (скільки сторінок робить це заповнити?)
  • семантика також глибоко хибна, Дата пояснює це досить докладно, але буде достатньо відзначити, що тризначна булева логіка насправді не відповідає реляційній алгебрі, де ряд може бути або не бути частиною таблиці
  • наявність мови програмування в якості основного (і часто тільки) інтерфейсу до баз даних виявилося дійсно поганим вибором, і це створило нову категорію вад безпеки

1

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

Декларативні мови, як зазначав Стефан Штайнгер, корисні для того, щоб вказати, що ви хочете, а не як ви хочете це зробити. Це означає, що ваші різні реалізації SQL пристойні з точки зору високого рівня: тобто, якщо ви хочете лише отримати деякі дані, і нічого іншого не має значення, ви можете задовольнити себе написанням відносно простих запитів та вибором реалізації SQL це саме для вас.

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

Найбільша проблема у мене з SQL - це як у інших «стандартизованих» мов, реальних стандартів дуже мало. Я майже вважаю за краще вивчити цілком нову мову між Sybase та MySQL, щоб я не заплутався в двох конвенціях.


Ви можете врятувати себе від цього болю, просто не використовуючи MySQL. ;)
Стівен Ювіг

1

Хоча SQL справді виконує роботу, у неї, безумовно, є проблеми ...


  • вона намагається одночасно бути високим і низьким рівнем абстракції , і це ... дивно. Можливо, це мали бути два чи більше стандартів на різних рівнях.
  • це величезний збій як стандарт . Багато речей піде не так, коли стандарт або утримується у всьому, вимагає занадто багато реалізацій, запитує занадто мало, або чомусь не досягає частково соціальної мети мотивувати постачальників та впроваджувачів для отримання суворо відповідних сумісних повноцінних реалізацій. Ви, звичайно, не можете сказати, що SQL зробив щось із цього. Подивіться на деякі інші стандарти та зауважте, що успіх чи невдача стандарту є явно фактором корисної співпраці:
    • RS-232 ( Погано , недостатньо майже вказано. Навіть, який контактний контакт передається та який контактний PIN-код отримується, необов’язково. Ви можете виконати, але все одно нічого не досягнете. Шанс успішного інтеропу: дійсно низький, поки IBM PC не зробив фактично корисний стандарт .)
    • IEEE 754-1985 з плаваючою точкою ( погано , надмірно: ні один суперкомп'ютер, ні наукова робоча станція, ні мікропроцесор RISC ніколи не прийняли його, хоча врешті-решт через 20 років ми змогли його гарненько реалізувати у HW. Принаймні, світ врешті-решт перетворився на нього.)
    • C89, C99, PCI, USB, Java ( Добре , будь то стандартний або специфікаційний, їм вдалося мотивувати суворе дотримання майже всіх, і ця відповідність призвела до успішної взаємодії.)
  • його не вдалося обрати для, мабуть, найважливішої бази даних у світі . Хоча це більше, ніж причина, ніж причина, той факт, що Google Bigtable не є SQL і не є реляційним, є своєрідним антидосягненням для SQL.

0

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

Переваги величезні. Написання тестів навколо коду, використання експресивних класів, сильно набраних наборів даних тощо. Ми використовуємо "DAL" сортів, що є чистою реалізацією DDD за допомогою Generics в C #. Таким чином, у нас є загальні сховища, реалізація одиниці роботи (транзакції на основі коду) та логічне розділення. Ми можемо робити такі речі, як знущатися з наборів даних з невеликими зусиллями і насправді розвиватись перед реалізацією бази даних. Було заздалегідь витрачено на створення такого каркасу, але це дуже приємно ділова логіка знову є зіркою шоу. Зараз ми споживаємо дані як ресурс і обробляємо їх мовою, якою ми користуємось у коді. Додатковою перевагою такого підходу є чітке розмежування, яке він забезпечує. Наприклад, я більше не бачу запит до бази даних на веб-сторінці. Так, цій сторінці потрібні дані. Так, база даних задіяна. Але тепер, куди б я не діставав дані, є одне (і єдине) місце, щоб зайти в код і знайти його. Можливо, це не велика справа щодо менших проектів, але коли у вас є сотні сторінок на сайті або десятки вікон у настільному додатку, ви справді можете оцінити це.

Як розробник мене прийняли на реалізацію вимог бізнесу, використовуючи мої логічні та аналітичні навички - і наша реалізація рамки дозволяє мені зараз бути більш продуктивними. Як менеджер, я вважаю за краще, щоб мої розробники використовували свої логічні та аналітичні навички для вирішення проблем, ніж писати SQL. Те, що ми можемо створити цілу програму, яка використовує базу даних, не маючи бази даних до кінця циклу розробки, - прекрасна річ. Це не означає, як удар над професіоналами бази даних. Іноді реалізація бази даних є складнішою за рішення. SQL (а в нашому випадку, Views і Stored Procs, зокрема) - це пункт абстрагування, де код може споживати дані як послугу. У магазинах, де є чіткий поділ між даними та командами розробників, це допомагає усунути сидіння у схемі тримання, що чекає впровадження та зміни бази даних. Розробники можуть зосередитись на проблемному домені без наведення курсора на DBA, і DBA може зосередитись на правильній реалізації, не потребуючи розробника.прямо зараз .


1
Downvoter - обережно пояснити, чому або просто натиснути кнопку вниз для всього, з чим ви не згодні?
Джозеф Ферріс

0

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

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

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