Чи все ж є потреба в написанні SQL?


12

Маючи стільки інструментів ORM для більшості сучасних мов, чи все ще є приклад використання для написання та виконання SQL в програмі, в мові / середовищі, яка їх підтримує? Якщо так, чому?

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


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

коротка відповідь, ТАК.
габе.

Відповіді:


35
  • Вам зручніше писати SQL для запиту даних, ніж ви пишете процедурний код.
  • Ваш ORM, хоча і красиво дивитися, генерує жахливо повільний SQL в якійсь критичній області.
  • Вам потрібно скористатися функціоналом, що піддається вашим RDBMS, який не може / не може бути доступний через ваш ORM.
  • Кожен раз, коли ви набираєте SELECT * FROM..., Бог вбиває кошеня. А ви ненавидите кошенят.
  • Ви не використовуєте ORM, OOP або сучасну мову.

8
Всі вагомі причини. Ефективність була б моїм номером один. У деяких ситуаціях ORM, як ви вже говорили, генерує SQL, який можна вручну оптимізувати та налагодити.
Кріс

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

8
die kitty die !!
медуза

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

2
Більш важкі абстракції в стороні, тут люди, здається, забувають, що більшість ORM мають багато переваг перед простими SQL-запитами: кеш першого та другого рівня, ледаче завантаження (опціональне завантаження є опцією, щоб уникнути випуску N + 1) та мати можливість підключити -тестуйте рівень доступу до даних (за допомогою переключення СУБД на базу даних в пам'яті), просто назвіть декілька ...
rsenna

15

Написання складних SQL

ORM чудово підходять для базових речей. Однак для складних ситуацій вам доведеться писати SQL.

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


1
Нещодавно я переписав проект колеги. Я замінив 9 його проектів на C # (які включали 2 шари доступу до даних) одним сценарієм 150 рядків SQL. Запуск проекту (який імпортував дані з SchemaLogic у керовану службу метаданих SharePoint 2010) тепер займає 3 хвилини замість 15. Версія SQL настільки швидша та коротша, що навіть не віддалено смішна.
Мураш

Сто відсотків погоджуються. Для справжніх бізнес-заявок для будь-якого великого закладу завжди трапляються складні ситуації.
Рік Хендерсон

10
  • Перегляди
  • Тригери
  • Обмеження
  • Пакети (SSIS, DTS тощо)
  • У будь-який час вам потрібно точно контролювати потік виконання

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


Я погоджуюся, але питання полягає в тому, чи повинен бути SQL в моєму C # (наприклад) коді, а не в тому, чи потрібно виконувати роботу з БД. ORM лежатиме над більшістю цього матеріалу.
C. Росс

@c. ross Так, і це, звичайно, не звичайний випадок, у мене були підстави будувати / змінювати / розбирати всі ці речі за допомогою коду в точках моєї кар’єри. Якщо у вас немає причин робити ці речі в коді, ви цього не робите, але я не знаю, що ORM робить дуже хорошу роботу в операціях із схемою. Точний контроль потоку виконання є більш поширеним випадком для більшості людей, але є випадки, коли це також не потрібно. Ви також маєте рацію, що ОРМ може лежати на вершині, і я думаю, що це справедливо у багатьох випадках, якщо ви не зміните схему достатньо, щоб гнівати ОРМ.
Білл

4

Звичайно:

  • Зазвичай ORM інкапсулює багато, але врешті-решт, ви повинні знати, що відбувається за лаштунками. Це має вирішальне значення для продуктивності та масштабованості. Хоча всередині програми я не пишу стільки SQL, але приблизно знаю, як виглядає SQL або DDL.
  • Прямий SQL часто приємно писати запити лише для читання. Набагато простіше, як сформулювати його в мові запиту ORM, і ви також можете обмежити набір результатів (наприклад, 'select id from .....').
  • ORM взагалі не повинен тримати вас подалі від SQL. Я дуже часто використовую SQL для спеціальних запитів безпосередньо на DB-клієнті (наприклад, mysql-client). Це дає дуже гарний рівномірний інтерфейс та групування функціональних можливостей.

4

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

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

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


3

ORM - це інструмент у вікні інструментів програмістів. У них є свої проблеми. Деякі приклади:

  • Неможливо керувати sql
  • Страждає від проблеми n + 1

2
Що таке "проблема N + 1"? Я не знайомий ...
RationalGeek

Я думаю, що це так: stackoverflow.com/questions/97197/…
Ax

2
Не впевнений, що я згоден. Хороший ORM повинен дозволити вам виконувати необроблений SQL, коли це необхідно, а проблеми N + 1 - це як правило, помилки новинка (наприклад, вкладені петлі над лені завантаженими колекціями), яких легко уникнути.
richeym

@richeym: Ті, де перші речі, що спливають мені в голову. Інша відповідь, хоча моя спина. Справа в тому, що ORM - це лише інструмент, є випадки, коли надається перевагу необробленому sql.
Тоні

3

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

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

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

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


2

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

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

Також, використовуючи базу даних типу Oracle з дуже насиченою та потужною мовою процедур, ви можете зробити багато, навіть коли не потрібна «програма». PL / SQL на Oracle у потрібних руках дуже швидкий і ефективний.


1
PL / SLQ означає "Процедурна мова / Структурована мова запитів", так як це не "програма"?
Крістофер Махан

Крістофер Махан: Саме так. Основний продукт компанії, над якою я працював, складається з ~ 5 разів більше PL / SQL-коду, ніж Java Code (LOC).
користувач281377

0

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


0

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


0

Так, ви можете уникати написання SQL. Але ви натомість напишете HQL замість цього (або Linq, або DQL ...)!

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

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


0

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


0

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

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

У інший час вам може не знадобитися SQL для ваших CRUD-матеріалів, але в SQL є набагато більше, ніж прості запити SELECT, INSERT, UPDATE та основні JOIN. Ви можете робити дуже розумні речі з цим, і хоча ви не можете ними користуватися часто, корисно знати, що вони є.

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

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


Точно: написавши механізми звітності та вигадливі звіти із середовища зберігання даних oracle, я можу сказати вам, що знання SQL - це не те саме, що знати, як використовувати ORM.
Крістофер Махан

0

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

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


2
"будь-яке масштабне додаток повинно використовувати шар стійкості пам'яті (в оперативній пам'яті), який повинен кешувати пам'ять частин БД, які часто використовуються." - Буде робити це і будь-яка гідна база даних.
Меттью Фредерік

Android та iPhoneOS використовують SQLite, сумісну систему баз даних SQL-92. Дивіться stackoverflow.com/questions/2011724/…
Крістофер Махан

0

Складність та кількість записуючого SQL не є достатнім для того, щоб зробити підключення рамки ORM розумним.

(Я пишу SQL, можливо, раз на місяць, якщо)


0

Я стикався з багатьма великими корпусами з DBA, які активно бояться розробників, використовуючи засоби ORM.

Це DBA, які беруть участь у налаштуваннях та виконанні.

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

Крім того, інструментами ORM можна жорстоко зловживати і створювати такі ж погані Sql, як і самостійно писати Sql.


Я думаю, що DBA, який переживає за розробник, що використовує ORM, схожий на розробника, який турбується про аналітика / менеджера / клієнта, який надає інструмент, який дозволяє їм писати код!
gbjbaanb

0

Один biggie - міграція DDL та бази даних. Іноді вам потрібно вручну зшити цей матеріал, щоб оновити речі, не порушуючи наявних даних.

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