Разве Linq to SQL не упускает смысл? Разве ORM-картографы (SubSonic и т. Д.) Не являются оптимальными решениями? - PullRequest
69 голосов
/ 19 января 2009

Мне бы хотелось, чтобы сообщество приняло некоторые мысли о Linq to Sql и других средствах отображения ORM.

Мне нравится Linq to Sql и идея выражать логику доступа к данным (или операциям CRUD в целом) на вашем родном языке разработки, а не иметь дело с "несоответствием импеданса" между C # и SQL. Например, чтобы вернуть ObjectDataSource-совместимый список экземпляров Event для бизнес-уровня, мы используем:

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })

Если бы я реализовал это с использованием старых конструкций SQL-to-C #, мне пришлось бы создать класс Command, добавить параметр EventID (используя строку для описания аргумента "@EventID"), добавить запрос SQL введите строку в класс Command, выполните команду и затем используйте (cast-type) nwReader ["FieldName"], чтобы получить каждое возвращенное значение поля и назначить его члену вновь созданного экземпляра моего класса EventData (yuck).

Итак, , что - вот почему людям нравится Linq / SubSonic / и т.д. и я согласен.

Однако на более широкой картине я вижу ряд вещей, которые не верны. Я чувствую, что Microsoft также видит что-то не так, и именно поэтому они убивают Linq для SQL и пытаются перевести людей в Linq для Entities. Только я думаю, что Microsoft удваивает ставку из-за плохой ставки.

Так, что не так?

Проблема в том, что есть астронавтов архитектуры , особенно в Microsoft, которые смотрят на Linq to Sql и понимают, что это не настоящий инструмент управления данными: есть еще много вещей, которые вы не можете легко сделать из Комфортно в C # и они стремятся исправить это. Вы видите это в амбициях Linq to Entities, сообщениях в блоге о революционной природе Linq и даже в LinqPad вызов .

И проблема с в том, что заключается в том, что он предполагает, что SQL является проблемой. То есть, чтобы уменьшить легкий дискомфорт (несоответствие импеданса между SQL и C #), Microsoft предложила эквивалент скафандра (полная изоляция), когда пластырь (Linq to SQL или что-то подобное) вполне подойдет.

Насколько я вижу, разработчики достаточно умны, чтобы освоить реляционную модель и затем разумно применять ее в своих усилиях по разработке. На самом деле, я бы пошел еще дальше и сказал, что Linq to SQL, SubSonic и т. Д. уже слишком сложны: кривая обучения не так уж сильно отличается от освоения самого SQL. Поскольку в обозримом будущем разработчики должны осваивать SQL и реляционную модель, мы столкнулись с изучением двух языков запросов / CRUD. Хуже того, Linq часто сложно протестировать (у вас нет окна запроса), он удаляет нас на один уровень из реальной работы, которую мы выполняем (генерирует SQL), и имеет очень неуклюжую поддержку (в лучшем случае) для таких конструкций SQL, как Обработка даты (например, DateDiff), «Имея» и даже «Группировать по».

Какая альтернатива? Лично мне не нужна другая модель доступа к данным, как Linq to Entities. Я бы предпочел просто открыть окно в Visual Studio, ввести и проверить мой SQL, а затем нажать кнопку, чтобы сгенерировать или дополнить класс C # для инкапсуляции вызова. Поскольку вы уже знаете SQL, не хотели бы вы просто ввести что-то вроде этого:

Select EventID, Title From Events Where Location=@Location

и в результате получается класс EventData, который A) содержит поля EventID и Title в качестве свойств, а B) имеет метод фабрики, который принимает строку «Location» в качестве аргумента и генерирует список ? Вы должны тщательно продумать объектную модель (приведенный выше пример, очевидно, не справляется с этим), но фундаментальный подход, основанный на использовании SQL и устранении несоответствия импедансов, очень меня привлекает.

Вопрос: я ошибаюсь? Должна ли Microsoft переписать инфраструктуру SQL, чтобы вам больше не приходилось изучать управление SQL / реляционными данными? Могут ли переписать инфраструктуру SQL таким образом? Или вы думаете, что очень тонкий слой поверх SQL, чтобы избавить вас от необходимости настройки параметров и доступа к полям данных, вполне достаточен?

Обновление Я хотел продвинуть две ссылки на вершину, потому что я думаю, что они отражают важные аспекты того, что я преследую. Во-первых, CodeMonkey указывает на статью под названием «Вьетнам компьютерных наук». Требуется некоторое время, чтобы начать, но это очень интересное чтение. Во-вторых, AnSGri указывает на одну из наиболее выдающихся пьес Джоэла Спольски: Закон Утечки Абстракций . Это не совсем по теме, но это близко и является отличным чтением.

Обновление 2: я дал «ответ» ocdecio, хотя здесь есть много хороших ответов, и выбор «правильного» ответа является чисто субъективным. В этом случае его ответ в квадрате с тем, что я считаю действительно лучшей практикой, учитывая современное состояние технологий. Однако это та область, в которой я полностью ожидаю развития, поэтому все может измениться. Я хотел бы поблагодарить всех, кто внес свой вклад, я проголосовал за всех, кто, я думаю, дал вдумчивый ответ.

Ответы [ 24 ]

45 голосов
/ 19 января 2009

Позвольте мне предвосхитить это, сказав, что я парень из базы данных, окрашенный в шерсть.

Как грубое обобщение : разработчики не знают SQL. Разработчики на самом деле не хотят знать SQL. Они могут писать это, они могут создавать таблицы, но это заставляет их чувствовать себя непривлекательно. Они склонны делать глупости, когда необходимый запрос - это больше, чем простое соединение. Не потому, что разработчики глупы - потому что они не могут быть обеспокоены. Они как живут в мире, где им приходится иметь дело только с одним концептуальным пространством; переход от объектов к таблицам и обратно - это переключение контекста, цена, за которую они не любят платить.

Это не значит, что они плохие или неправильные; это означает, что есть возможность для улучшения. Если ваши клиенты (в данном случае разработчики, использующие вашу платформу) не любят SQL и таблицы - предоставьте им уровень абстракции, который позволит им уйти, не разбираясь с основным беспорядком.

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

36 голосов
/ 19 января 2009

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

18 голосов
/ 19 января 2009

Как минимум 6 лет я использую свой собственный ORM, основанный на очень простой концепции: проекция. Каждая таблица проецируется в класс, и SQL генерируется на лету на основе определения класса. Мне все еще нужно знать SQL, но он заботится о простом CRUD на 90%, и мне никогда не приходилось управлять соединениями и т. Д., И это работает для основных поставщиков БД.

Я доволен тем, что у меня есть, и не нашел ничего стоящего, чтобы бросить это.

12 голосов
/ 20 января 2009

ИМХО, OR / M - это не только абстрагирование SQL, скрытие SQL или включение поддержки нескольких СУБД.

Это позволяет вам уделять больше внимания проблемной области, поскольку вам приходится тратить меньше времени на написание скучных запросов CRUD SQL. С другой стороны, если вы используете хороший OR / M, этот OR / M должен позволять вам писать SQL-запросы, если это кажется необходимым.

OR / M может быть мощным инструментом, если вы используете его правильно; это может заботиться о ленивой загрузке, полиморфных запросах / ассоциациях ...
Не пойми меня неправильно; нет ничего плохого в простом SQL, но, если вам нужно позаботиться о переводе своей (хорошо продуманной и нормализованной) реляционной модели в выразительную модель ОО / предметной области, то я думаю, что вы тратите много времени на слесарное дело.

Использование OR / M также не означает, что вы, как разработчик, не должны знать SQL. ИМХО верно наоборот.
Знание SQL и умение писать эффективный SQL-запрос позволят -imho- правильно использовать OR / M.

Я должен также признать, что я пишу это с учетом NHibernate. Это OR / M, который я использую atm, и я еще не использовал Linq для SQL или Linq для сущностей (пока).

10 голосов
/ 20 января 2009

Дизайн Linq и инфраструктура linq to entity, безусловно, используют в качестве инструмента orm, но большая идея заключается в том, что он будет использоваться как общий API для запроса ЛЮБОГО источника данных, а не только СУБД.

Я помню, что читал, что linq, хотя и разработан специально для SQL, предназначен для языка запросов для любого хранилища данных. Вы можете писать запросы linq для SQL, но вы также можете теоретически писать запросы linq, предназначенные для ldap, файловой системы, exchange, веб-сервисов, до бесконечности. Вы не можете использовать SQL для этих программ.

Вам также необходимо изучить различные API практически для каждого хранилища данных. Linq дает всем общую цель - создать API доступа к данным.

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

Я добавлю несколько ссылок, если смогу найти их снова.

http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/

9 голосов
/ 19 января 2009

Тебе следует перестать беспокоиться и научиться любить ОРМ. Подобные абстракции помогут нам сосредоточить свои навыки и добиться успеха в этой области.

Еще есть много места, чтобы воспользоваться приобретенными функциональными навыками и применить их на прикладном уровне. На самом деле это одна из сильных сторон LINQ to SQL по сравнению с другими ORM.

Я могу согласиться только со многими другими комментариями. Время, которое вы сэкономите, вы можете сосредоточиться на совершенствовании модели вашего домена и сделать лучшее приложение. И, как только вы определили узкое место, используйте для создания оптимизированного SQL.

Что может быть неочевидно сразу, так это то, что ORM имеет ряд действительно приятных функций. Карта удостоверений, которая помогает избежать загрузки элементов снова и снова, отложенная загрузка помогает выразить домен с меньшими затратами, а единица работы помогает отслеживать изменения и оптимизировать записи в базу данных.

9 голосов
/ 19 января 2009

Я согласен на 100%. Во многом это связано с тем, что навыки процедурного кодирования и навыки SQL-кодирования сильно различаются; и этот факт не получил широкого признания. Таким образом, пока эта реализация не достигнет цели, программисты ищут способы сделать свой набор навыков переносимым из одного домена в другой.

Это не работает.

Вы просто должны научиться сдвигать фазу: учиться думать по-разному о вашем коде в зависимости от того, к какому домену вы обращаетесь.

Кто-нибудь еще заметил, насколько сложным и многословным становится запрос, когда он отображается из SQL в LINQ? Мол, во всех онлайн примерах?

7 голосов
/ 20 января 2009

Как отметил Дмитрий , разработчики не знают SQL. Точнее, большинство знают SQL, но не понимают его и определенно не любят, поэтому они стремятся искать волшебную пулю, создавая спрос на такие вещи, как Linq создать иллюзию (хм, абстракция), что они не используют ничего, кроме своих любимых классов.

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

Некоторые решения ORM безусловно хороши (например, JPA / Hibernate), не потому, что при их использовании вам не нужно беспокоиться о SQL. Фактически, для эффективного использования JPA вам необходимо очень глубокое понимание БД в целом, в частности, запросов к способностям. Хорошим моментом является то, что они заставляют машину выполнять скучную работу до такой степени, что она автоматически генерирует всю базу данных с нуля.

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

6 голосов
/ 19 января 2009

Историческая перспектива.

Когда Кодд и др. и др. Первоначально разрабатывали теорию и реализацию реляционных баз данных, одной совершенно отдельной проблемой было «Как мы запрашиваем эти вещи»? Был предложен ряд стратегий и синтаксисов с различными преимуществами и недостатками. Одним из этих кандидатов был SQL (в его самой ранней форме, очевидно.) Другой был QBE (Query By Example). Я считаю, что другого звали "кель"; и было несколько других. SQL, конечно, не стал доминирующим, потому что он был признан выше всех остальных. К сожалению, все же многие из них исчезли из-за нищеты всех нас (потому что они могут использоваться одновременно на одних и тех же данных).

Если у Microsoft есть хорошая история о том, что они возрождают один из этих других языков или изобрели достойное дополнение, то я думаю, что мы посоветовали бы послушать. Но пока все, что я видел, это еще одно «Одно кольцо, чтобы управлять ими всеми».

Существует множество идей и строгости SQL, а также проверенная временем долговечность. У Microsoft есть определенная история веры в то, что их заведомо первоклассная организация по разработке может перевесить остальных из нас, включая наши коллективные институциональные воспоминания. Кажется, не часто так получается. Пока мы связаны с хранилищами реляционных данных, мы должны дважды подумать о парадигмах суперсет абстракции, которые уводят нас от голого металла с обещаниями равной или лучшей производительности.

5 голосов
/ 25 января 2009

Заявление Дмитрия о том, что разработчик не любит SQL, может иметь много правды, но решение - не только ORM. Решение состоит в том, чтобы нанять в составе команды разработчиков DBA. В моей компании у моей команды разработчиков .net есть превосходный администратор баз данных Oracle, который абсолютно не занимается производственной базой данных. Его роль в нашей команде - моделирование данных, физическое проектирование БД, создание хранимых процедур, анализ данных и т. Д. Он является причиной, по которой наша сторона БД настолько чиста и эффективна. Весь наш доступ к БД осуществляется через хранимые процедуры.

Что такое разработка DBA? http://www.simple -talk.com / SQL / базы данных администрирования / что использование-это-развитие-DBA /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...