Entity Framework VS LINQ для SQL VS ADO.NET із збереженими процедурами? [зачинено]


430

Як би ви оцінили кожну з них з точки зору:

  1. Продуктивність
  2. Швидкість розвитку
  3. Акуратний, інтуїтивно зрозумілий, бездоганний код
  4. Гнучкість
  5. Загалом

Мені подобається мій SQL і тому завжди був шаленим шанувальником ADO.NET і зберігаються процедур, але нещодавно я зіграв з Linq в SQL і мене здуло те, як швидко я виписав свій шар DataAccess і вирішив витратити якийсь час справді розуміє або Linq до SQL, або EF ... чи ні?

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

Оновлення: Чи можете ви сконцентруватися на EF VS L2S VS SP, а не на ORM VS SP. Мене в основному цікавить EF VS L2S. Але я дуже прагну їх порівняти із збереженими документами, оскільки звичайний SQl - це те, про що я багато знаю.


94
не конструктивна та ще стільки оновлень? ...;)
BritishDeveloper

34
Я не бачу, чому хтось відзначив це не конструктивним. Мені це здається дуже гарним. +1 від мене.
Thanushka

10
На мій погляд, це відмінне питання. Особисто я помітив Entity Framework і всі подібні ORM там повільніше порівняно з простим / простим кодом ADO.Net. Я робив цей тест 2 роки тому, а потім знову тиждень назад. Я не впевнений у тому, як LINQ у SQL порівнюється з EF. Але ADO.Net завжди буде найкращим у виконанні. Якщо ви хочете заощадити час розробки, то Entity Framework є хорошим інструментом, але, безумовно, не тоді, коли продуктивність є вашою основною проблемою.
Суніль

2
@Timeless: Існує тенденція не покладатися на механізми бази даних. Кожен двигун бази даних має власну мову збережених процедур, тому є додаткове навчання. 99,9% розробників можуть розраховувати на ORM, які виробляють досить хороший код і створюють SQL автоматично. Різниця в продуктивності незначна у випадку простого CRUD. Збережені процедури складніше розробити та підтримувати. Кілька років тому, коли не було ORM, і нічого не було створено магічно і автоматично з бази даних. Написання SP-файлів вважалося не таким трудомістким, оскільки це було альтернативою написанню SQL-заяв у додатку.
LukLed

4
@Sunil є правильним, хоча і недостатньо словним. Проблема полягає в тому, що всі думають, що їх основна проблема - це ефективність додатків. Коли я говорю про додатки, які вимагають найвищої продуктивності, я думаю про жорсткі C ++ MMO або великі обсяги транзакцій із базою даних, орієнтованих на клієнтів, у великі мільйони. Вам дійсно слід зосередитись на об'єктно-орієнтованих принципах, таких як ремонтопридатність , читабельність , незрозуміле ігнорування та розділення логіки домену . Особливо, коли підвищення ефективності є незначним у кращому випадку або не існує у багатьох випадках.
Suamere

Відповіді:


430

По-перше, якщо ви починаєте новий проект, перейдіть з Entity Framework ("EF") - він тепер генерує набагато кращий SQL (більше схожий на Linq для SQL) і простіший у обслуговуванні та потужніший, ніж Linq у SQL (" L2S "). Що стосується випуску .NET 4.0, я вважаю Linq для SQL застарілою технологією. МС були дуже відкритими щодо подальшого розвитку L2S.

1) Продуктивність

На це складно відповісти. Для більшості одноосібних операцій ( CRUD ) ви знайдете приблизно однакову ефективність за всіма трьома технологіями. Ви повинні знати, як працюють EF та Linq до SQL, щоб використовувати їх якнайповніше. Для операцій з великим обсягом, таких як запити опитування, можливо, вам доведеться, щоб EF / L2S "компілював" ваш запит сутності таким чином, що рамці не доведеться постійно регенерувати SQL, або ви можете зіткнутися з проблемами масштабованості. (див. правки)

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

2) Швидкість розвитку

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

3) акуратний / підтримуваний код

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

4) Гнучкість

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

5) загалом

Не зациклюйтеся на помилковій дихотомії вибору ORM порівняно із збереженими процедурами. Ви можете використовувати обидва в одному додатку, і, мабуть, вам слід. Великі масові операції повинні входити в збережені процедури або SQL (який насправді може бути названий EF), а EF слід використовувати для ваших операцій CRUD та більшості потреб вашого середнього рівня. Можливо, ви хочете використовувати SQL для написання звітів. Я здогадуюсь, мораль історії така сама, як це було завжди. Скористайтеся правильним інструментом для роботи. Але худий його, EF зараз дуже хороший (станом на .NET 4.0). Витратьте в реальному часі читання та розуміння його в глибині, і ви можете легко створювати дивовижні, високопродуктивні програми.

EDIT : EF 5 трохи спрощує цю частину за допомогою автоматично складених запитів LINQ , але для реальних речей з високим обсягом вам обов’язково потрібно перевірити та проаналізувати, що найкраще підходить вам у реальному світі.


35
Абсолютно геніальна відповідь. Зараз я дійсно використовую EF, щоб швидко розробити додаток. Якщо продуктивність стає проблемою, для відновлення погано виконуваних запитів EF буде приведено збережені програми. Дякую!
BritishDeveloper

17
@BritishDeveloper: Крім того, не забувайте про можливість використання поглядів. Ми досягли великого успіху, визначивши пару поглядів у наших проектах L2S та використовуючи їх там, де, здається, рамки пишуть погані запити. Таким чином, ми отримуємо всі переваги використання фреймворку з усіма перевагами написання власного SQL.
Дейв Маркл

5
Я також використовую Views;) Більше як обхід для неперехресного обмеження db EF. Хоча хороша ідея для використання для оптимізації. Спасибі
BritishDeveloper

5
Однозначно чудова відповідь. Просто хотів додати спостереження, яке я мав на власному досвіді щодо L2S проти EF4. Помінявшись на L2S -> EF4 після того, як ми зрозуміли, що ми можемо використовувати декілька диференційованих RDMBS ... але, поки ще працює MSSQL, падіння продуктивності показало переважно в області графічного інтерфейсу мого додатка. Прив'язка даних до набору результатів у L2S була набагато швидшою, ніж EF4. Це точно той самий запит у точно такій самій БД. Тут слід зазначити одне, що я повертаю 90k + записи, тому різниця була досить очевидною. Можливо, на менших наборах це не проблема? Не впевнений, як це буде масштабуватись, хоч із сайтами з високим
обсягом

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

93

Збережені процедури:

(+)

  • Велика гнучкість
  • Повний контроль над SQL
  • Найвища доступна продуктивність

(-)

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

ORM:

(+)

  • Швидкий розвиток
  • Код доступу до даних зараз знаходиться під контролем джерела
  • Ви ізольовані від змін у БД. Якщо це трапиться, вам потрібно лише оновити модель / відображення в одному місці.

(-)

  • Продуктивність може бути гіршою
  • Відсутній або невеликий контроль над SQL, який виробляє ORM (може бути неефективним або гірше баггі). Можливо, потрібно втрутитися та замінити його на спеціально збережені процедури. Це зробить ваш код безладним (деякі LINQ в коді, деякі SQL в коді та / або в БД поза контролем джерела).
  • Будь-яка абстракція може виробляти розробників "високого рівня", які не мають уявлення, як це працює під кришкою

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

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


47
Я не думаю, що питання щодо контролю над джерелами є актуальними. Схема бази даних, збережені процедури, UDF тощо можуть бути і повинні знаходитися під контролем джерела.
Лі Ганн

15
+1 дляAs any abstraction can produce "high-level" developers having no idea how it works under the hood
nawfal

3
Погоджено, аргумент джерела контролю невірний. Ми завжди зберігаємо наші сценарії створення бази даних у svn. Як ви навіть можете тримати базу даних поза контролем джерела при розробці програми бази даних?
Wout

3
EF не дуже підходить для високої доступності та високої продуктивності, я не DBA, але я не бачу, що пропонує EF, що полегшує кодування.
Джеймі

4
Отже, ми відмовляємось від гнучкості, повного контролю та продуктивності для «швидкого розвитку» та уникаємо змін коду, якщо зміниться БД. Мені це звучить як чистий лінь.
користувач2966445

18

ваше питання - це в основному O / RM проти написання SQL

Використовуючи ORM або звичайний SQL?

Погляньте на деякі інші O / RM рішення там, L2S не єдиний (NHibernate, ActiveRecord)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

для вирішення конкретних питань:

  1. Залежить від якості рішення O / RM, L2S досить добре створює SQL
  2. Як правило, це набагато швидше, використовуючи O / RM, як тільки ви попрацюєте процес
  3. Код, як правило, набагато акуратніше і більш ретельний
  4. Прямий SQL, звичайно, отримає вам більшу гнучкість, але більшість O / RM можуть виконувати всі, крім найскладніших запитів
  5. В цілому, я б запропонував перейти з O / RM, втрата гнучкості незначна

@David Дякую, але це не ORM проти SQL. Я хочу перейти до ORM, і мені цікаво, що вкласти час на навчання: EF або L2S (якщо вони не є сміттям порівняно зі збереженими програмами)
BritishDeveloper

1
Я б точно сказав, що вони не сміття порівняно із збереженими документами, і побічна перевага полягає в тому, що у вас немає коду, розповсюдженого в базі даних. Особисто мені подобається L2S, але в даний момент я мало що робив з EF, і, схоже, L2EF витіснить його, тому я б пішов на EF. Крім того, як тільки ви підете на Linq, ви не повернетесь назад.
BlackICE

13

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

Особисто у мене є пристрасне нелюбов ORM інструментів (див мій викривальну тут для деталей), і тому я не бачу ніяких причин , щоб сприяти L2EF, так як L2S дає мені все , що я коли - або чекати необхідності від рівня доступу до даних. Насправді я навіть думаю, що такі функції L2S, як ручне складання карти та моделювання спадкування, додають абсолютно непотрібної складності. Але це тільки я. ;-)


1
L2S досить хороший, але має і недолік, який Microsoft заявив, що вони в основному не збираються багато інвестувати в його розширення. Результати цього можна побачити вже в останній версії, яка містить лише кілька виправлень помилок та додано деяку підтримку типів даних SQL Server 2008.
FinnNk

Погоджено, @FinnNk. Прикро реальність, що використовувати L2S є дещо ризикованим через його статус парії. Але якщо вони дійсно повністю відмовилися на користь L2EF, я сильно підозрюю, що був би міграційний шлях, через наступне, що йому все ще подобається.
Марсело Кантос

3
Linq to EF дозріла, і тепер виробляє SQL так само добре, як L2S (станом на .NET 4.0). L2EF набагато приємніше, ніж L2S сьогодні, оскільки він принаймні може оновлювати вашу модель у міру зміни БД, що L2S ніколи не може зробити автоматично. Мені також подобається те, що ви можете відображати прості M: M відносини з EF як відносини, не потребуючи проміжного утворення. Це робить код набагато чистішим.
Дейв Маркл

2
Дякуємо за оновлення @Dave. Однак я не згоден з коментарем M: M. Схеми, з якими я працював, майже завжди роблять додаткові атрибути в таблицях приєднання. Це викликає структурну зміну об'єктної моделі, що вимагає багато переробки коду. Я б швидше вирішив проміжне відношення прямо з самого початку.
Марсело Кантос

1

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

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

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

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

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