2009-06-19 4 views
19

Учитывая предпосылку:Почему люди используют linq для sql?

  • Есть компетентна SQL программисты (correlary - написание SQL-запросы не проблема)
  • Есть компетентные разработчикам приложений (correlary - есть простая/сильная/гибкая архитектура обработка соединений и простые запросы из кода)

Почему люди используют linq для sql?

  • Там находится наверху добавляется к каждой сделке
  • Существует большая вероятность снижения производительности при умеренных комплекс расчетов (БД сделаны для наборов обработки и расчетов и были команды инженеров, работающих оптимизацию - зачем возиться с этим ?)
  • Существует потеря гибкости (если вы хотите добавить еще одно ui (не .NET-приложение) или метод доступа, вам либо нужно поместить запросы обратно в db, либо создать отдельный слой доступа к данным)
  • Существует потеря безопасности, не имея централизованного управления записью/обновлением/чтением на db (например, запись изменилась - если вы разрешаете приложениям использовать linq для sql для обновления, тогда вы не можете подтвердить, какое приложение изменило его или какой экземпляр приложения изменил его)

Я продолжаю видеть вопросы о linq для sql, и мне интересно, не хватает ли я что нибудь.

ответ

39

Я продолжаю видеть вопросы о linq для sql, и мне интересно, не хватает ли я чего-то.

Это не значит, что вы что-то упустили. Это что у вас есть что-то большинство магазинов не имеют:

Есть компетентные SQL программисты

Кроме того, в вашем магазине эти компетентные SQL программисты предпочитают писать SQL.


Вот точка ответа точки:

Там находится наверху добавляется к каждой сделке

целом верно. Этого можно избежать, переведя запросы, прежде чем они понадобятся для запуска с использованием CompiledQuery для многих (но не для всех!) Сценариев.

Существует большая вероятность снижения производительности при умеренных комплекс расчетов (БД сделаны для наборов обработки и расчетов и были команды инженеров, работающих оптимизацию - зачем возиться с этим)

Либо ты «Записываем linq, который переводится в sql, а затем создается оптимизатор из оптимизатора - или ваш письменный sql-код, из которого создается оптимизатор плана.В обоих случаях вы говорите машине, что хотите, и она должна выяснить, как это сделать. Вы предполагаете, что подрыв оптимизатора с помощью подсказок подсказок является хорошей практикой? Многие компетентные программисты SQL не согласятся с этим предложением.

Существует потеря гибкости (если вы хотите добавить еще один интерфейс (не .NET приложение) или метод доступа, вы должны либо поместить запросы обратно в БД или сделать отдельный слой доступа к данным)

Многие люди, использующие linq, уже являются SOA. Линки живут в службе. Приложение non .NET вызывает службу. Бада-бинг бада-бум.

Существует потеря безопасности, не имея централизованный контроль записи/обновления/чтения на дб (например, запись изменилась - если разрешить приложениям использовать LINQ для SQL для обновления, то вы не можете доказать, какое приложение изменило его или какой экземпляр приложения изменил его)

Это просто неправда. Вы доказываете, какое приложение подключено и выдает команды sql так же, как вы доказываете, какое приложение подключено и вызывает sproc.

+1

Если бы я мог продвигать его более одного раза, я бы ... Хорошо написано, Хороший ответ! – bytebender

+1

+1, но я хотел бы добавить только две крошечные детали. 1) CompiledQuery отлично подходят для часто исполняемых запросов без дополнительных параметров. Если у вас есть много дополнительных параметров в запросе, они могут повредить производительность из-за потери гибкости, добавленной оптимизацией/упрощением запросов на стороне клиента L2S. 2) Даже для компетентных программистов SQL, при написании сильно типизированных запросов убирает много «взглядов на диаграмму модели печатных данных на столе» при написании сложных запросов. Intellisense заполняет детали ... – KristoferA

+0

Хорошие очки KristoferA. Другое место CompileQuery не помогает, если запрос имеет localCollection.Contains, поскольку коллекция может отличаться по размеру. –

29

Позвольте мне перечислить вам несколько моментов:

  1. Есть небольшие софтверные компании или средние компании, которые развивают свое программное обеспечение в доме, которые могли бы скорее сосредоточиться на получении многих разработчиков приложений, чем получение фрилансер DB разработчика или даже навсегда нанять его.
  2. В большинстве случаев накладные расходы являются непроизводительными либо из-за количества обрабатываемых данных, либо из-за низкого трафика. Кроме того, при правильном использовании LINQ to SQL может выполнять так же быстро, как большинство SQL-запросов + связанный код .net.
  3. Многие компании просто придерживаются стека Microsoft, и они могут пользоваться только интеграцией. Некоторая другая компания развивается с использованием SOA, это просто не проблема. Другие не вынуждены выбирать LINQ-to-SQL, и если они делают этот выбор, это их проблема, как его интегрировать. Никто никогда не говорил, что LINQ-to-SQL - это серебряная пуля :)
  4. Я считаю, что безопасность получила с LINQ-to-SQL, потому что я столкнулся с множеством SQL-запросов, берущих в неэкранированные данные с конкатенацией строк и т. Д. И объясняя вся параметризованная идея запроса никогда не была легкой. Кроме того, поскольку все запросы в конечном итоге преобразуются в SQL, если только проблема отслеживания, которую вы описываете, не будет выполняться с помощью хранимой процедуры, снова нет проблем.

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

+1

Отличный ответ. +1 –

+3

Хороший разработчик приложений должен иметь возможность писать SQL-код промежуточного уровня, особенно для приложений большого размера, которые обычно зависят от большой зависимости. Кроме того, я бы сказал, что вы не можете написать достойный LINQ to SQL, не понимая, что он делает под капотом, включая SQL, который он пишет. – alchemical

+3

Прошу отличить. На самом деле, хотя общие принципы реляционных баз данных и запросов должны быть известны для написания хорошего кода, SQL - это просто (плохой) диалект и скрытие его за более безопасным, более интуитивным слоем - это то, о чем следует приветствовать, если не сказать больше. Не хотите ли вы доказать, что я ошибаюсь, вы должны уметь защищать идею о том, что кто-то изучает внутренние и внешние соединения в SQL и почему нельзя быть хорошим разработчиком, обращающимся к базам данных, не выделяя этого. Или любая из многих особенностей, связанных с SQL, с которыми можно жить без. – em70

4

Для меня требуется намного меньше времени, чтобы написать linq в код sql, чем писать кучу хранимых процедур. Это особенно верно, когда дизайн еще не закончен, в этом случае я еще не знаю, какую часть работы я хочу делать на объектах C# и сколько я хочу делать в SQL.

Итак, я могу пропустить наборы данных здания, мне не нужно нажимать кнопку «Щелчок», чтобы добавить запросы, в основном, linq to sql означает, что я могу изменить свой код за меньшее время.

Кроме того, как большой поклонник Haskell, я могу написать много функционального кода с linq для sql, и он просто работает.

2

Некоторые удобные функции - отладчик, собирающий ошибки sytax в вашем запросе, по сравнению с написанием операторов SQL в виде строк. Ошибки, которые не получат до времени выполнения.

Плюс Я считаю, что инструкции LINQ легче читать, чем SQL.

+0

whoa ... никто не может писать sql-операторы в виде строк. также, отладчик сервера sql так же хорош, как и отладчик vs – mson

+4

@mson: отладчик сервера sql не забирает, когда ваша программа пытается сохранить значение int в поле varchar. Linq будет - во время компиляции. –

+0

@mson: некоторые люди верят в это или нет. Даже если вы используете классы SQL ADO.NET, у вас все еще могут быть проблемы с процедурами и т.д. отсутствуют параметры и т. Д. – 2009-06-19 14:31:06

14

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

Linq-to-SQL отнимает часть повторяющегося характера. Он имеет инструмент для автоматического создания бизнес-объектов из вашей схемы базы данных, и он дает вам хороший интегрированный язык запросов, который проверяет тип времени компиляции и находится в вашем коде (0) Я могу написать DAL в Linq-to-sql в несколько раз быстрее, чем я могу использовать простой SQL, хранимые procs или параметризованные запросы.

Если вы хотите сохранить сохраненные процессы как linq-to-sql, так и EF, поддерживающие использование сохраненных процессов для всего доступа к данным, вам просто нужно настроить соответствующие сопоставления. Таким образом, вы все равно можете использовать сохраненные procs для регистрации данных и обеспечения безопасности, если хотите. Мы предпочитаем использовать auth для Windows и использовать это для ограничения доступа к каждой таблице для разных пользователей, тогда у нас есть куча триггеров в таблицах, которые отслеживают детали для целей аудита.

Две вещи, которые я буду быстро заметить, это то, что во-первых, структура сущности, похоже, получает больше поддержки от MS на данный момент, и я подозреваю, что это будет считаться стандартом по умолчанию для будущего, предпочитая linq-to -SQL. Во-вторых, в .Net 3.5 EF и linq-to-sql не имеют очень хорошей поддержки для отключенных приложений n-уровня. В обоих случаях вы можете обманывать или сериализовать контексты данных на своих отключенных уровнях, или вручную отсоединять и повторно присоединять свои объекты данных. Это значительно улучшилось в .net 4.0. Просто подумайте, в зависимости от того, какая версия у вас есть.

1

Это может быть случай удобства, торжествующий над производительностью. Если вы программируете на уровне uber-производительности на уровне Facebook, вы можете подумать о каждом такте, но простая истина в том, что большинство приложений не нуждаются в этом внимании и извлекают выгоду из эффективности обслуживания кода и времени разработки (100k подрядчик против другой $ erver).

Это говорит о том, что для аутсорсинга требуется большая часть обработки запросов из окна БД в системах очень высокого масштаба, иначе БД - это горло бутылки, и вам нужно очертить или перестроить архитектуру по линии. Дорогостоящие.

Я думаю, что это справедливо сказать, что LINQ будет масштабироваться лучше/проще как с точки зрения серверов, так и со многих ядро ​​в том, что ваша кодовая база LINQ получит m-core для «свободного», как только MS релиз C# 4.0.

Я вижу вашу точку в запросе, а в качестве разработчика nonASP.NET, начинающего проект www впервые, я не вижу точки 80% ASP.NET (темы, элементы управления и т. Д.) - мне кажется, мне нужно больше узнать и код больше, чем сам HTML! - опять же, я уверен, что для этого есть веская причина.

--- Я не получил 50 очков, чтобы прокомментировать пост я хочу, так что я делаю это здесь ---

David B показывает, что писать некоторые SQL все есть, чтобы получить большинство из SQL Server, и что использование подсказок подсказок - это механизм рулевого управления. Та же задача может быть достигнута разными способами в SQL, и многие из них в 1000 раз увеличивают производительность. Я предлагаю прочитать Inside T-SQL Querying (Itzik Ben Gan). Снова и снова Itzik показывает, как переосмыслить запрос и использовать новые команды для сокращения логических чтений, иногда от тысяч до менее десяти.

4

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

Я работал над приложением, где код был полностью изолирован от базы данных, кроме как через набор открытых хранимых процедур. Код не мог «знать» что-либо о схеме базы данных, за исключением того, что был возвращен из хранимых процедур.

Хотя это не так уж и необычно, и не так сложно писать DAL с использованием ADO или что-то еще, я решил попробовать Linq to Sql, хотя он не будет использовать его для своей реальной цели и не будет использовать большинство функций. Оказывается, это было отличное решение.

Я создал класс Linq to Sql, перетащил сохраненные procs из проводника сервера в правую часть конструктора, затем ... Подождите, тогда нет. Я был в значительной степени.

Linq создал строго типизированные методы для каждой сохраненной процедуры. Для procs, который возвратил строки данных, Linq автоматически создавал класс для элементов в каждой строке и возвращал для них List<generatedClass>. Я обернул сами звонки в легком общедоступном классе DAL, который сделал некоторую проверку и некоторую автоматическую настройку параметров, и я был сделан. Я написал класс бизнес-объекта и сопоставил динамически сгенерированные объекты класса Linq с бизнес-объектом (делал это вручную, но это не сложно сделать или поддерживать).

Программа теперь невосприимчива к любому изменению схемы, которое не влияет на сигнатуры хранимой процедуры. Если подписи меняются, мы просто оттаскиваем старый proc от дизайна и перетаскиваем его обратно, чтобы восстановить код. Несколько проходит через модульные тесты для внесения изменений (которые обычно не выходят за пределы общего DAL-интерфейса), и это сделано. Вещи, расположенные выше DAL, используют методы Linq to Objects для выбора, фильтрации и сортировки данных, которые находятся не в правильном формате, прямо из хранимых вызовов proc.

У нас есть отличные администраторы баз данных, которые записывают хранимые процедуры и совершенно другую группу, записывают другой код, поэтому, возможно, это хороший пример того, почему (и как) вы можете использовать LINQ в описываемом вами сценарии.

9

Существующий вопрос/ответ в том же духе/дух:

Я лично считаю, что нет правильного или неправильного ответа. Это зависит от того, что вы разрабатываете и как вы его разрабатываете.Если вам нужна четкая резкость, иметь слишком сложную модель данных и т. Д., Пропустите абстракцию. Если вы чувствуете, что абстракция ускоряет время разработки, как идея захвата всей логики приложения в одной кодовой базе и т. Д., Используйте ее.

+0

спасибо за размещение ссылок! – mson

0

Для очень простых запросов накладные расходы дополнительного слоя добавляются к стоимости переезда. Для более сложных запросов в обычных сценариях бизнес-приложений оптимизация, выполняемая манерой перевода Linq-to-SQL expression-> sql, часто может сэкономить много.

В качестве примера, недавно я сделал перевод строки 1400+ (!), Поставляемой заказчиком, в L2S. Он не только перешел от 1400 строк SQL к 500 строкам гораздо более читаемого, строго типизированного и прокомментированного кода. Он также начал бить базу данных со средним значением ~ 1500 чтений вместо ~ 30 тыс. Считываний. Это до того, как я даже начал смотреть на оптимизацию db-side - это экономия - это то, что я могу 100% -му атрибуту способности L2S устранять предикаты, которые можно оценить на стороне клиента.

+0

У меня есть чувство, что вы могли получить еще лучшее улучшение, оптимизируя код прямо в sql ... – mson

+0

Да, но это потребовало бы гораздо больших усилий. Здесь это было сделано для меня каркасом - экономия человеко-часов. – KristoferA

-3

пожалуйста, повторите за мной (мин 3 раза)

  • нет серебряной пули

  • Я не буду использовать технологию только потому, что его последняя вещь из MSFT

  • Я не буду используйте что-то, чтобы получить его на моем резюме

Не только их компетентные SQL-кодеры, любые приличные программист приложений, особенно LOB-приложения, должен писать промежуточный SQL. Если вы не знаете SQL и пишите LINQ to SQL, как вы собираетесь отлаживать ваши вызовы данных? Как вы собираетесь профилировать их для устранения узких мест?

Мы пробуем LINQ к SQL, и я думаю, что существуют серьезные проблемы, связанные с ним, такие как:

  • Там не существует простой способ возврата результатов запроса к другому объекту. Это само по себе кажется безумным. Microsoft создала тип анонимного типа var и рекомендует его использовать, но нет способа переместить эти данные из вашего локального метода, поэтому парадигма oo ломается, если вам нужно использовать данные в той же функции, что и ее.

  • Таблицы НЕ являются объектами. Изучите 3-ей нормальную форму и т. Д. Реляционные базы данных предназначены для хранения данных, а не для их использования. Я не хочу, чтобы меня ограничивали или поощряли использовать мои таблицы в качестве объектов. Данные, которые я извлечь из базы данных будет очень часто может быть присоединяется нескольких таблиц, и может включать в себя SQL отбрасывает, функцию, операторы и т.д.

  • Там нет прироста производительности, и небольшая потеря

  • Теперь я иметь способ больше кода, чтобы беспокоиться. Существуют файлы dbml и все еще DAL, чтобы написать LINQ. Да, многие из них генерируются машиной, что не означает, что его нет, что-то другое, что может пойти не так (т. Е. Ваши файлы dbml и т. Д.).

Теперь, когда я дал фон, я попытаюсь ответить вам актуальный вопрос, почему люди используют LINQ To SQL:

  • Его последняя вещь от Microsoft, и я хочу его мое резюме.
  • Msft убедил менеджеров/управляющих, что это уменьшит время кодирования
  • Разработчики ненавидят SQL. (Не хорошо DEV среды или отладки, кроме вручную - это было бы неплохо иметь более IntelliSense к инструменту SQL.)

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

-2

простой ответ, есть два подхода: создать изысканный Rube Goldberg contraptions или просто выполнить работу простым способом. Многие разработчики склоняются к первому.

Разработчикам легко надоедает, и часто им лично нравится делать что-то труднее, что, кажется, обеспечивает определенную интеллектуальную красоту. Вы разрабатываете приложение или пишите кандидатскую диссертацию? Поскольку мой директор msft кричал в коридорах: «Я не хочу другого исследовательского проекта!»

Смежные вопросы