Разве Linq to SQL не упускает суть? Не являются ли ОРМ-картографы (дозвуковые и т. д.) неоптимальные решения?
Я хотел бы, чтобы сообщество приняло некоторые мысли, которые у меня были о Linq to Sql и других картах ORM.
мне нравится Linq to Sql и идея выражения логики доступа к данным (или операций CRUD в целом) на вашем родном языке разработки, а не иметь дело с "несоответствием импеданса" между C# и SQL. Например, чтобы вернуть ObjectDataSource-совместимый список экземпляров событий для бизнес-уровня, мы используем:
return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })
Если бы я должен был реализовать это используя старые версии SQL в C# создает, то мне придется создать команду класса, добавьте код события параметр (используя строку для описания "@кодом" аргумент), добавить SQL-запрос строку в классе команд, выполнение команды, а затем использовать (литой тип)nwReader["Имя_поля"] тянуть друг возвращается значение поля и присвоить его член вновь созданный экземпляр моего класса функция eventdata (фу).
и это почему люди любят Linq / SubSonic / etc. и я соглашаться.
однако в более широкой картине я вижу ряд вещей, которые являются неправильными. Я чувствую, что Microsoft также видит что-то не так, и именно поэтому они убийство Linq to SQL и пытается переместить людей в Linq к сущностям. Только, я думаю, что Microsoft удвоение на плохой ставке.
что случилось?
проблема в том, что есть архитектура космонавты, особенно в Microsoft, которые смотрят в Linq to Sql и понимают, что это не настоящий инструмент управления данными: есть еще много вещей, которые вы не можете сделать легко комфортно в C#, и они направлены на восстановить ее. вы видите, что это проявляется в амбициях Linq to Entities, сообщениях в блоге о революционно природа Linq и даже LinqPad challenge.
и это это то, что он предполагает, что SQL является проблемой. То есть, для того, чтобы уменьшите мягкий дискомфорт (несоответствие импеданса между SQL и C#), Microsoft предложила эквивалент космического костюма (полная изоляция), когда пластырь (Linq to SQL или что-то подобное) будет делать просто отлично.
уже слишком сложно: в кривая обучения не так уж сильно отличается от освоения самого 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 указывает на статью под названием "Вьетнамской компьютерная наука." это займет некоторое время, чтобы начать, но это очень интересно читать. Во-вторых, Ансгри указывает на одну из наиболее известных работ Джоэла Спольски: закон дырявых абстракций. Это не совсем по теме, но это близко и прекрасно читать.
Update 2: я дал "ответ" на ocdecio, хотя здесь есть много отличных ответов, и выбор "правильного" ответа является чисто субъективным. В этом случае, его ответ в квадрате с тем, что я думаю действительно лучшая практика, учитывая современное состояние технологий. Однако это область, которую я полностью ожидаю развивать, поэтому все может измениться. Я хотел бы поблагодарить всех, кто внес свой вклад, я поддержал всех, кто, как мне кажется, дал вдумчивый ответ.
24 ответа:
по крайней мере, 6 лет я использую свой собственный ORM, который основан на очень простой концепции: проекция. Каждая таблица проецируется в класс, и SQL генерируется на лету на основе определения класса. Он по - прежнему требует от меня знать SQL, но он заботится о 90% простой CRUD, и мне никогда не приходилось управлять соединениями и т. д.-И он работает для основных поставщиков БД.
Я доволен тем, что у меня есть, и не нашел ничего, что стоило бы отбросить.
позвольте мне предисловие к этому, сказав, что я крашеный в шерсти парень базы данных.
как грубое Чрезмерное обобщение: разработчики не знают SQL. Разработчики на самом деле не хочу знать SQL. Они могут писать его, они могут создавать таблицы, но это заставляет их чувствовать себя неприглядными. Они, как правило, делают глупые вещи, когда необходимый запрос больше, чем простое соединение. Не потому, что разработчики глупы-потому что их нельзя беспокоить. Они как живем в мире, где они должны иметь дело только с одним понятием пространства; переход от объектов к таблицам и обратно переключение контекста той цены, за которую они не любят платить.
Это не значит, что они плохие или неправильные; это означает, что есть возможность для совершенствования. Если вашим клиентам (в данном случае разработчикам, использующим ваш фреймворк) не нравятся SQL и таблицы-дайте им слой абстракции, который позволит им уйти, не имея дело с базовым беспорядок.
Это та же логика, которая делает сбор мусора / автоматизированное управление памятью большим хитом. Да, разработчики могут справиться с этим; да, они могут писать код, который лучше оптимизирован без него; но отсутствие необходимости иметь дело с ним делает их счастливее и продуктивнее.
Я думаю, что популярность ORMs была порождена разработчиками, разрабатывающими слои данных и пишущими один и тот же код CRUD снова и снова приложение за приложением. ORMs-это просто еще один инструмент/технология, которая позволяет разработчикам тратить меньше времени на написание одних и тех же операторов SQL снова и снова и сосредоточиться на логике приложения (надеюсь).
IMHO или/M-это не только "абстрагирование SQL" или скрытие SQL или включение поддержки нескольких СУБД.
Это позволяет вам уделять больше внимания вашей проблемной области, так как вы должны тратить меньше времени на написание скучных запросов CRUD SQL. С другой стороны, если вы используете хороший или/M, этот или/M должен позволить вам писать SQL-запросы, если это кажется необходимым.
или/М может быть мощным инструментом, если вы используете его правильно; он может заботиться о ленивой загрузки, полиморфные запросы / ассоциации ...
Не поймите меня неправильно; нет ничего плохого в простом SQL, но, если вам нужно позаботиться о переводе вашей (хорошо продуманной и нормализованной) реляционной модели в выразительную модель OO/domain, то я думаю, что вы тратите много времени на сантехнику.использование OR / M также не означает, что вы-как разработчик - не должны знать SQL. Обратное верно имхо.
Знание SQL и знание того, как написать эффективный SQL-запрос, will-imho-позволит вам правильно использовать OR/M.Я также должен признать, что я пишу это с NHibernate в виду. Это OR / M, который я использую atm, и я еще не использовал Linq to SQL или Linq to entities (пока).
дизайн Linq и LINQ to entities framework, безусловно, используются в качестве инструмента orm, но большая идея заключается в том, что он будет использоваться в качестве общего api для запроса любого источника данных, а не только СУБД.
Я помню, что читал, что linq, хотя он явно разработан с учетом SQL, должен быть языком запросов для любого хранилища данных. Вы можете писать запросы linq для SQL, но вы также можете теоретически писать запросы linq, которые нацелены на ldap, файловые системы, exchange, веб-службы, ad infinitum. Вы не могу использовать SQL для этих программ.
вам также нужно изучить другой API для почти каждого хранилища данных. Linq дает всем общую цель для создания API доступа к данным.
работает ли это видение или нет, еще предстоит увидеть, но это идея. Я думаю, что, поскольку мы хотим, чтобы системы взаимодействовали все больше и больше, мы можем найти очень хорошее применение для l2e.
Я добавлю несколько ссылок, если смогу их найти снова.
http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/
вы должны перестать беспокоиться и научиться любить ОРМ. Абстракции, подобные этим, помогут нам сосредоточить наши навыки и добиться прогресса в этой области.
есть еще много места, чтобы воспользоваться функциональными навыками, которые вы приобрели, и применить их на прикладном уровне. Это на самом деле одна из сильных сторон LINQ to SQL по сравнению с другими ORM.
Я могу только согласиться со многими другими комментариями. Сколько времени вы экономите, вы можете сосредоточиться на доработке вашего домена модель и сделать лучшее приложение. И, как только вы определили узкое место, используйте для создания оптимизированного SQL.
Что может быть не сразу очевидно, так это то, что ORM поставляется с рядом функций, которые действительно хороши. Карта идентичности, которая помогает избежать загрузки элементов снова и снова, ленивая загрузка помогает вам выразить домен с меньшим количеством сантехники, а единица работы помогает отслеживать изменения и оптимизировать записи в базу данных.
согласен на 100%. Многое из этого является результатом того, что процедурные навыки кодирования и навыки кодирования SQL очень различны; и этот факт не получил широкого признания. Таким образом, пока эта реализация не достигнет, программисты ищут способы сделать свой набор навыков переносимым из одного домена в другой.
Это не работает.
вы просто должны научиться фазовому сдвигу: узнайте, как думать о своем коде по-разному в зависимости от того, в каком домене вы находитесь адресация.
кто-нибудь еще заметил, насколько более сложным и подробным становится запрос, когда он отображается из SQL в LINQ? Например, во всех онлайн-примерах?
Как Дмитрий указал, разработчики не знают SQL. Точнее, большинство знаю SQL, но не понять это и определенно не нравится, поэтому они склонны искать волшебную пулю, создавая спрос на такие вещи, как Linq, чтобы создать иллюзию (хм, абстракцию), что они не используют ничего другого, чем их любимые классы.
Это очень плохо, как закон дырявых абстракций всегда держит истинный.
некоторые решения ORM определенно хороши (например, JPA/Hibernate), а не потому, что с их помощью вам не нужно беспокоиться о SQL. На самом деле, чтобы эффективно использовать JPA вам нужно очень глубокое понимание БД в целом, запрашивая способности в частности. Хороший момент в том, что они сделайте машину сделать скучную работу, до точки, где он автоматически генерирует всю базу данных с нуля.
Linq to SQL, как я думаю, не решает реальной проблемы. Это вроде как другое презентация, не более того. Это может быть хорошо, хотя это усложняет и без того сложный язык. С другой стороны, Linq to Objects-очень интересная концепция, потому что это своего рода sql-запрос коллекций.
исторической перспективе.
когда Codd et. Эл. первоначально разрабатывались теория и реализация реляционных баз данных, один совершенно отдельный вопрос был "как мы запрашиваем эти вещи"? Был предложен ряд стратегий и синтаксисов с различными сильными и слабыми сторонами. Одним из таких кандидатов был SQL (в его самой ранней форме, очевидно.) Другой был QBE (запрос по примеру). Другой, кажется, назывался "квел", и было еще несколько других. SQL, конечно, нет стать доминирующим, потому что он был признан выше всех других. К сожалению, другие в значительной степени исчезли, к бедности всех нас (потому что они могут быть использованы одновременно на одних и тех же данных.)
Если у Microsoft есть хорошая история о том, что они возрождают один из этих других языков или изобрели достойное дополнение, то я думаю, что нам было бы неплохо послушать. Но до сих пор все, что я видел, это еще одно "одно кольцо, чтобы управлять ими всеми".
там чертовски много мыслей и строгости за SQL, и много проверенной временем долговечности. Microsoft имеет определенную историю веры в то, что их, по общему признанию, первоклассная организация развития может перехитрить остальных из нас, включая нашу коллективную институциональную память. Это не часто работает. Пока мы привязаны к реляционным хранилищам данных, мы должны дважды подумать о парадигмах абстракции надмножеств, которые уводят нас от голого металла с обещаниями равных или лучших спектакль.
будучи автором проекта ORM сам, я должен признать, что мой ответ на такой вопрос, как это, склонен быть немного предвзятым. Я уже разработал некоторые из моих собственных мыслей об ответе до прочтения вопроса,поэтому я уже несколько привязан.
Я скажу, что моя причина для разработки ORM была не из-за "несоответствия импеданса" между SQL и императивным программированием, а скорее исключительно с целью стать агностиком платформы базы данных. Этот прежняя проблема необходимости писать больше кода для управления сохраняемостью-это небольшое препятствие, которое легко решается, если вы работаете только с одним поставщиком базы данных. Стать агностиком платформы баз данных-гораздо более сложная проблема, и imo оказывает гораздо большее влияние на прибыльность вашего бизнеса, предполагая, что, как и я, вы планируете продавать программное обеспечение другим людям (а не просто использовать его в доме).
когда я начал работать над своими инструментами ORM несколько лет назад, концепция была непрактичной в мой любимый язык, большинство людей, с которыми я говорил, не понимали, почему я работаю над этим, и некоторые хорошо уважаемые голоса в сообществе написали статьи в торговых журналах, заявив, что то, что я уже сделал, было не только невозможно, но и нежелательно. Некоторые из тех же причин были даны - это слишком сложно, это ограничивает и добавляет накладные расходы. Сегодня в том же сообществе есть по крайней мере три популярных инструмента абстракции баз данных (хотя есть некоторые споры об определении термин ОРМ). Причина, по которой я упоминаю об этом, заключается в том, что когда я начал работать над этими инструментами, первоначальные возражения имели гораздо больший вес, чем сейчас. Базовой технологии аппаратного и программного обеспечения изменилась за прошедшие годы, чтобы сделать эти инструменты гораздо более практичным в долгосрочной перспективе. Моя тенденция заключается в том, чтобы попытаться взглянуть на программное обеспечение и работать над решениями, которые, возможно, еще не совсем практичны, но скоро станут практичными. Так что, учитывая, что я не буду рассчитывать LINQ для сущностей как хорошее решение для некоторых проблем.
Я также предпочитаю больше вариантов, а не меньше. Поэтому, хотя я могу поддержать идею разработки LINQ to Entities, я менее склонен поддерживать убийство LINQ to SQL merelyu, потому что LINQ to Entities стал доступным. Объекты отлично подходят для того, что делают объекты, в этом нет никаких сомнений... По моему (опять же предвзятому) мнению, проблема возникает в том, что люди видят любой данный инструмент или парадигму программного обеспечения как " волшебство пуля " и хотят настоять на том, что все должно быть именно так. Хорошо известно, что реляционная база данных очень хорошо справляется с некоторыми другими задачами, и хорошим примером является отчетность. Поэтому, на мой взгляд, это своего рода выстрел в ногу, чтобы настаивать на том, что все должно быть сущностями, потому что тогда вы заставляете себя использовать неэффективный инструмент для работы. Так что в отношении отчетности в частности, избавление от LINQ to SQL и использование только LINQ для сущностей по крайней мере на поверхности звучит мне нравится инверсия абстракции шаблон анти.
поэтому я думаю, что синопсис для моего ответа таков: используйте молоток, если ваша проблема - гвоздь-используйте отвертку, если ваша проблема-винт.
заявление Дмитрия о том, что разработчикам не нравится SQL, может иметь много правды, но решение не только ORM. Решение состоит в том, чтобы нанять в составе команды разработчиков A Development DBA. В моей компании Мой .net команда разработчиков обладает отличным администратором базы данных Oracle, который делает абсолютно никаких производственных работ дБА. Его роль в нашей команде-моделирование данных, физическое проектирование БД, создание хранимых процессов, анализ данных и т. д. Он является причиной того, что наша сторона db настолько чиста и работает. Весь наш доступ к БД осуществляется через сохраненные процессы.
Что такое разработка DBA ? http://www.simple-talk.com/sql/database-administration/what-use-is-a-development-dba/
Я думаю, что логика этих вещей заключается в том, что накладные расходы на создание и запуск оператора SQL на уровне фреймворка незначительны по сравнению с накладными расходами в других частях системы (например, HTTP-запрос туда и обратно на порядки больше).
преимущества-быстрая разработка, запросы, которые вписываются в язык, а не экранированные строки и т. д., часто перевешивают недостатки. Если производительность является проблемой, то вы можете оптимизировать позже.
Я не думаю, что "не нужно знать SQL" является фактором. Любой приличный разработчик должен будет знать SQL в какой-то момент своего развития. Идея уровня абстракции базы данных состоит в том, чтобы удалить усилия по созданию шаблонного кода для запросов к базе данных.
действительно, в нашей системе на Java я создал утилиту генератора кода, которая взяла аннотированные классы и сгенерировала полный CRUD API, и обрабатывала все эти причудливые вещи, которые вы собираете с течением времени. Гораздо проще создайте свою модель и аннотировать его, чем тянуть через написание DAO. Масштабируйте такой инструмент, и вы получите LINQ или Hibernate или множество других решений ORM DB.
Я занимаюсь как базой данных, так и распределенным прикладным программированием (веб-и скомпилированным) и чувствую, что время для разработки слоев доступа к данным на основе хранимых процедур-это хорошо потраченное время. Лично я предпочитаю делать моделирование данных и определять необходимые процессы на ранней стадии процесса разработки... кажется, чтобы помочь раскрыть дизайн / интерфейс логики / структуры вопросов.
Я не большой поклонник встроенного программирования баз данных (независимо от того, является ли код sql ручным или машинным). Я верю, что база данных является основой приложения, и это требует времени, чтобы она хранила ручные коды procs.
тем не менее, я заинтригован концепцией OODBMS и надеюсь, что когда-нибудь я смогу работать над некоторыми в производственной среде.
Если вы хотите, чтобы база данных выполняла масштабирование, она должна быть спроектирована и нормализована в соответствии с рекомендациями реляционной модели базы данных.
Если вы позволите объектной модели и ORM диктовать вашу модель данных, вы просто получите плохую модель данных, которая не нормализована и/или содержит артефакты из объектной модели.
1 Таблица = 1 классе-плохая идея.
начать с вами никогда, никогда, есть классы, которые представляют многие-ко-многим или таблицы ссылок "многие к одному". Они соответствуют дочерним коллекциям в объектной модели-сами ссылки не являются объектами.
Если вы рассматриваете свою базу данных как таблицы, чтобы просто держать свои объекты в строках (один общий подход) и предоставить приложению прямой доступ к таблицам, вы отказываетесь от всех преимуществ определения уровня интерфейса служб базы данных, которые база данных может использовать для защиты своего периметра.
платформы имеют свое место, но если вы используете их просто сохраняйте свои объекты в соответствии с вашей объектной моделью, ваша база данных не будет реляционной базой данных, и она не сможет использоваться как одна для целей ETL, отчетности, рефакторинга и т. д.
было еще вопрос что спросил об Ормс в целом. Проверьте это для дальнейшего обсуждения того, является ли несоответствие импеданса таким же большим, как и все это.
Я думаю, что реальное решение, которое им было нужно, было чем-то больше похоже на SQL-литерал. VB.Net 9.0 поддерживает XML-литералы, которые позволяют писать XML прямо в коде, и убедитесь, что он проверен и соответствует DTD. Аналогичная хорошая функция - это литералы SQL, которые позволяют писать встроенный SQL-код в коде .Net и проверять его в среде IDE. Там должна быть какая-то архитектура плагина для проверки информации в базе данных, но это может быть легко написано для популярных движков баз данных. Это обеспечило бы то, что я считаю реальным решением проблемы, которую они пытались решить, не прибегая к неоптимальным решениям.
Codemonkey делает очень хороший момент: хранимые процедуры предлагают уровень абстракции, который выполняет некоторые из обещаний более сложных моделей ORM. Это не интуитивно на первый взгляд, но я могу вспомнить из моего собственного кода. У меня есть" check-in " sproc, который касается почти дюжины столов (кому принадлежит этот идентификатор? есть ли у них членство? Есть какие-нибудь сообщения? Они получают баллы за эту регистрацию? так далее.).
моделирование этого в C# - независимо от того, как сложная модель данных-никогда не будет хорошей идеей, поскольку это потребует многих поездок "по проводам" для проверки данных и обновления различных таблиц. Хотя это правда, что вы можете обрабатывать sprocs в Linq или других ORMS,все, что мне нужно - это класс-оболочка, который позволяет мне вызывать sproc со стандартными параметрами C#. На самом деле, это была такая насущная необходимость для меня, что я написал генератор кода в T-SQL для создания таких оболочек.
Мне не нравится ни одно из текущих решений - но я предпочитаю больше вариантов, чем меньше вариантов; -)
Я давно использовал OODBMS в проекте, который был ближе всего к тому, чтобы получить его правильно (к сожалению, у продукта были некоторые отвратительные ошибки и ужасная техническая поддержка) - сохраняемость объекта была в значительной степени невидимка, обрабатывается за кулисами (через препроцессор код-генератор) и управляется очень простым обновлением, удалением и поиском методов и простых стеклотара.
Я хотел бы увидеть это (и, возможно, какая-то объектно-объектная модель уже делает это хорошо) снова, с OCL (Object Constraint Language) в качестве родного языка многообъектных запросов
Я должен согласиться с тем, что всплеск инструментов ORM в значительной степени связан с раздражением написания SQL, имея дело с любым драйвером БД, который вы должны использовать, внутренне абстрагируясь между DBs (Oracle vs SQL Server, vs whatever для повторного использования кода) и преобразования типов данных.
идеальное решение? определенно нет! Однако я думаю, что это итерация в процессе лучшего слияния приложения с хранилищем данных. Ведь, в большинстве случаев, имея БД без доступа приложение, написанное на любом языке, практически бесполезно. (вы действительно когда-нибудь просто установите oracle и ожидаете, что все сотрудники будут работать в SQLPlus напрямую?)
таким образом, я думаю, что хранилище данных и приложение просто движутся вместе таким образом, что разработчик приложения может более легко взаимодействовать с хранилищем данных.
в частности, для .NET то, что я бы предпочел видеть вместо Linq, - это встроенный способ сопоставления определения класса с базовыми данными источник в базовое хранилище данных, и все сантехнические работы просто работают.
другими словами, я мог бы просто сказать "Employee.Name = 'rally25rs'; " и свойство объекта изменится, и под этим он будет сохраняться в самом хранилище данных. Просто отбросьте SQL полностью вместо того, чтобы идти 1/2 пути, как это делает сейчас Linq to SQL.
конечно, такое решение вызывает проблемы с производительностью, обработкой транзакций и т. д.
может быть, вся концепция язык программирования и реляционные базы данных должны быть переосмыслены и перестроены? По своей сути они являются совершенно отдельными и разрозненными сущностями. Возможно, пришло время просто отказаться от "реляционной базы данных sql aware" и построить следующее, когда выполнение строки кода будет напрямую работать с базой данных.
нет никаких проблем с linq, но с теми, кто его использует и игнорирует то, что происходит "за кулисами"
Я по-прежнему предпочитаю, чтобы мои руки грязные с SQL. По крайней мере, я точно знаю, что происходит.
Тед Ньюард написал большое эссе о своем взгляде на эту тему - что ОРМ-это "Вьетнам" компьютерной науки...
http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx
большинство людей упустили важный момент: в большинстве случаев, вы значительно более производительной при запросе в LINQ, чем в SQL. У меня статьи о том, почему это так.
когда я поставил задачу LINQPad, я не шутил: я делаю почти все свои специальные запросы в LINQ, потому что большинство запросов могут быть написаны быстрее и надежнее в LINQ, чем в SQL. Я также разрабатывал и работал над большими бизнес-приложениями, используя LINQ to SQL и наблюдался значительный рост производительности труда. Это не" архитектура астронавта " материал-LINQ to SQL является продуктивной и практичной технологией, которая диски этого самого сайта.
самая большая помеха с LINQ не в состоянии должным образом изучить его. Я видел так много запросов LINQ, которые ужасны транслитераций запросов SQL для резервного копирования этого. Если вы пишете запросы LINQ, используя только свои знания SQL, конечный результат может быть только таким же - или хуже - чем SQL.
Я только что обнаружил этот вопрос. Я предполагаю, что это некрасиво получилось, но я все равно вставить свои пять копеек...
Я хочу написать код для вещей, которые не очевидны.
код CRUD очевиден. Я не хочу это писать. Поэтому Ормы-хорошая идея.
Это не означает, что у ORMs нет проблем, но проблемы связаны с выполнением, а не с намерением. По мере созревания ORMs проблемы будут уменьшаться, а рост производительности уже доступные для простых сценариев в конечном итоге распространятся и на сложные сценарии.
LINQ также является хорошей идеей. Другие упомянули ряд преимуществ, но все, что мне нужно сделать, это подумать о первом разе, когда я попытался сделать поворот в LINQ, где я не знал количество столбцов заранее. Или в первый раз я понял, что мне не нужно создавать новый
DataView
каждый раз, когда я хотел или что-то вроде фильтра. LINQ дает мне возможность делать все, что я хочу делать с данными в C#, вместо того, чтобы выяснить, как разделить работу между SQL и C#.Итак, да, ORMs, LINQ и другие новые технологии являются неоптимальными решениями, но они не упускают суть, и они не будут неоптимальными навсегда.
Я хотел написать это как ответ на @SquareCog reply здесь, но он сказал мне, что у меня осталось -1836 символов. S. O. noob здесь так извиняется, если я сделал это неправильно.
в 18 веке джентльмен досуга использовал для изучения науки. В то время наука в целом не была таким большим предметом, чтобы разумный человек не мог понять всего этого. Под этим я подразумеваю, что один ученый человек мог бы понять всю полноту научного мышления тогдашний.
Так же и с программированием.
в наши дни поле языка программирования достаточно велико и растет достаточно быстро, что это столько, сколько можно разумно ожидать от разработчика, чтобы знать всю его собственную специализированные языки. Для квалифицированного кодера также ожидается, что он поймет всю область базы данных, включая дизайн базы данных, нюансы собственного SQL и то, как он работает с различными базами данных, а также администрирование этих баз данных, возможно, требует немного много.
Я думаю, что некоторые из ответчиков здесь замалчивают некоторые сложности разработки большой производительной базы данных уровня предприятия, зная "несколько операторов SQL" больше всего конечно, не режет его. Именно поэтому большинство крупных программных домов имеют специальные команды разработчиков баз данных. Как говорит Страуструп, 'Разделяй и властвуй' - это единственный способ эффективно бороться со сложностью, связанной с разработкой и управлении крупными программными проектами.
разработчикам не нравится работать с SQL, потому что они ленивы или потому что это заставляет их чувствовать себя "неприглядными". Они не любят работать с SQL, потому что они умные. Они знают лучше, чем кто-либо, что только тот, кто специализируется на SQL будет поставлять функциональность базы данных самого высокого качества и что для них, чтобы поставить в положение "Джек всех профессий" разработчиков является неоптимальной стратегией развития.