Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext
, на которые ссылается тестируемый код, должны быть изделены.
См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.
Я, конечно же, согласен с тем, что синтаксис SQL с трудом работает, как с точки зрения его автоматического генерации, так и с точки зрения его разбора, и это не стиль языка, который мы будем писать сегодня, если бы мы разрабатывали SQL для требования, которые мы делаем сегодня. Я не думаю, что мы найдем так много разнообразных ключевых слов, если бы мы разработали язык сегодня, я подозреваю, что синтаксис соединения будет другим, такие функции, как GROUP_CONCAT
, будут иметь более регулярный синтаксис, а не добавлять больше ключевых слов в середину круглых скобок контролируйте его поведение ... создайте свой собственный список ошибок несоответствий и избыточности в SQL, которые вы хотите / ожидаете увидеть сглаженными, если мы переработали язык сегодня.
Нет альтернативы SQL для общения с реляционными базами данных (например, SQL как протокол), но есть много альтернатив написанию SQL в ваших приложениях. Эти альтернативы были реализованы в виде интерфейсов для работы с реляционными базами данных. Некоторые примеры интерфейсов включают в себя:
Я думаю, что основная тема сегодня заключается в том, что вместо замены SQL одним новым языком запросов мы вместо этого создаем языковые интерфейсы, чтобы скрыть SQL в нашем обычном каждый день на языках программирования и обработку SQL как протокола для общения с реляционными базами данных.
Существует множество реализаций SQL (SQL Server, mysql, Oracle и т. д.), но нет другого языка , который служит с той же целью в смысле являющийся языком общего назначения , предназначенным для хранения и извлечения реляционных данных .
Существуют базы данных объектов , такие как db4o , и есть похожие так называемые базы данных noSQL , которые относятся только к любому механизму хранения данных, который не полагается на SQL, но чаще всего открывается -source, такие как Cassandra , основанные на концепции Bigtable от Google.
Существует также ряд специальных продуктов для баз данных, таких как CDF, но вы, вероятно, вам не нужно беспокоиться о них - если вам это нужно, вы узнаете.
Ни один из них не эквивалентен SQL.
Это не значит, что они " лучше "или" хуже "- они просто не то же самое. Деннис Форбс написал отличную статью , недавно разбив ряд странных претензий на SQL. Он утверждает (и я согласен), что эти жалобы происходят в основном от людей и магазинов, которые либо выбрали неправильный инструмент для работы в первую очередь, либо неправильно используют свои SQL-СУБД (я больше не удивляюсь, когда я см. другую базу данных SQL, где каждый столбец является varchar(50)
, и нигде нет ни одного индекса или ключа.
Если вы реализуете еще один сайт социальной сети и не слишком озабочены ACID , обязательно начните искать такие продукты, как db4o. Однако, если вы разрабатываете критически важную бизнес-систему, я очень высоко рекомендую вам дважды подумать, прежде чем присоединиться к хору «SQL sucks». Сначала сделайте исследование, узнайте, какие функции могут поддерживать и не могут поддерживать различные продукты.
Изменить - я был занят написанием своего ответа и не получил вопрос с нескольких минут. Сказав это, SQL по существу неотделима от СУБД. Если вы запустите продукт базы данных SQL, вы получите доступ к нему с помощью SQL, period.
Возможно, вы ищете абстракции по синтаксису; Linq to SQL, Entity Framework, Hibernate / NHibernate, SubSonic и множество других инструментов ORM предоставляют собственный SQL-подобный синтаксис, который не совсем соответствует SQL. Все они «скомпилируются» для SQL. Если вы запустите SQL Server, вы также можете написать CLR Functions / Procedures / Triggers, который позволяет писать код на любом языке .NET, который будет работать внутри базы данных; однако это не является заменой SQL, а больше расширением для него.
Я не знаю ни одного полного «языка», который вы можете сложить поверх базы данных SQL; если вы перейдете к другому продукту базы данных, вы, в конце концов, увидите SQL на трубе.
Проблемы с SQL побудили меня подготовить черновик запросов, указанный SMEQL , в репозитории хранилища ссылок в Portland wiki . Комментарии Добро пожаловать. Он заимствует идеи функционального программирования и экспериментального языка IBM Business System 12. (Я изначально называл его TQL, но позже нашел это имя.)
SQL де-факто.
Рамки, которые пытаются защитить разработчиков от этого, в конечном итоге создали свой собственный язык (Hibernate HQL приходит на ум).
SQL решает проблему довольно хорошо. Изучение не сложнее, чем язык программирования высокого уровня. Если вы уже знаете функциональный язык, тогда вам нужно понять SQL.
Учитывая, что ведущие поставщики баз данных, предоставляющие современные базы данных (Oracle и SQL Server) поддерживают SQL и вкладывают годы в механизмы оптимизации, и т. д., и все ведущие программы моделирования данных и программного обеспечения для управления изменениями заключаются в SQL, я бы сказал, что это самая безопасная ставка.
Кроме того, база данных больше, чем просто запросы. Существует масштабируемость, резервное копирование и восстановление, интеллектуальный анализ данных. Крупные продавцы поддерживают многие вещи, которые даже новые «кеш-движки» даже не рассматривают.
В мире .NET, хотя у него все еще есть чувство SQL-esque, LINQ-to-SQL позволит вам иметь хорошее сочетание обработки данных и SQL-данных в памяти. Это также упрощает много низкоуровневых данных, которые никто не хочет делать.
Если вы хотите увидеть тип базы данных совершенно другого мышления, взгляните на CouchDB
g0]. «Лучше», очевидно, является относительным требованием, и этот вид базы данных несовместимости «Лучше», но только в определенных сценариях.Прямой ответ: я не думаю, что там есть серьезный соперник. DBase и его подделки (Foxpro, Codebase и т. Д.) Некоторое время были соперниками, но я думаю, что они в основном потеряли язык запросов к базе данных. Было много других продуктов баз данных, которые имели свой собственный язык запросов, таких как «Прогресс» и «Парадокс», а также несколько других, которые я использовал, имена которых я не помню и, безусловно, многие другие, о которых я никогда не слышал. Но я не думаю, что любой другой соперник даже приблизился к тому, чтобы получить нетривиальную долю рынка.
Как простое доказательство того, что существует различие между форматом базы данных и языком запросов, последняя версия из DBase, который я использовал - много лет назад, - предложил как «традиционный» язык запросов базы данных, так и SQL, оба из которых могут использоваться для доступа к тем же данным.
Side ramble: я бы не стал говорят, что SQL отстой, но у него много недостатков. Имея в виду многолетний опыт и задним числом, которые мы имеем сейчас, я уверен, что можно разработать лучший язык запросов. Но создание лучшего языка запросов и убеждение людей в его использовании - это две разные вещи. Было бы достаточно лучше убедить людей в том, что это стоит того, чтобы учиться. Люди потратили много лет своей жизни на изучение эффективного использования SQL. Даже если ваш новый язык проще в использовании, наверняка будет кривая обучения. И как бы вы перенести существующие системы с SQL на новый язык? И т. Д. Это можно сделать, конечно, так же, как C ++, C # и Java в значительной степени свергли COBOL и FORTRAN. Но для этого требуется сочетание технического превосходства и хорошего маркетинга.
Тем не менее, я получаю смешок от людей, которые спешат вперед, чтобы защитить SQL в любое время, когда кто-то ее критикует, которые настаивают на том, что любая проблема, с SQL должно быть вашей собственной неуместностью в использовании, а не какой-либо ошибкой SQL, что вы должны просто не достигнуть более высокого плана вещей, необходимого для понимания его совершенства и т. д. Успокойтесь, сделайте глубокий вдох: мы оскорбляем компьютер язык, а не ваша мать.
SQL язык очень эффективен, а системы управления реляционными базами данных были и остаются огромным успехом. Но есть класс приложений, который требует очень высокой масштабируемости и доступности, но не обязательно высокой степени согласованности данных (в конечном итоге важна последовательная согласованность). Разнообразные системы получают лучшую производительность и масштабирование, чем СУБД, ослабляя потребность в полноценных транзакциях, совместимых с ACID. Они были названы «NoSQL», но, как указывают другие, это неправильное название: возможно, они должны быть названы базами данных NoACID.
Майкл Стоунбрейкер описывает это в . «NoSQL» обсуждает ничего делать с SQL .
Общее движение в эти дни - NoSQL; обычно эти технологии:
Лично я думаю, что нет ничего плохого в SQL, если это соответствует вашим потребностям. SQL является выразительным и отлично подходит для работы со структурированными данными.
Еще в 1980-х годах ObjectStore обеспечивал прозрачный доступ к объектам. Это было похоже на RDBMS плюс ORM, за исключением всех лишних негерметичных уровней абстракции: он хранил объекты непосредственно в базе данных.
Таким образом, эта альтернатива была действительно «ни одного языка вообще», или, возможно, язык, который вы уже используете ». Вы должны писать код C ++ и создавать или перемещать объекты, как если бы они были родными объектами, и база данных позаботилась обо всем по мере необходимости. Вроде как ActiveRecord, но он действительно работал так же, как заявка на маркетинг Blitzes от ActiveRecord. : -)
(Конечно, у него не было маркетинговой мышцы Oracle, и у него не было нулевой стоимости MySQL, поэтому все игнорировали его. И теперь мы пытаемся реплицировать это с помощью РСУБД и ОРМ , и некоторые люди пытаются утверждать, что таблицы действительно имеют смысл для хранения объектов, и что писать гигантский XML-файл, чтобы сообщить компьютеру, как сопоставлять объекты с таблицами, является каким-то разумным решением.)
Я думаю, вам может быть интересно посмотреть на Dataphor , который является средой реляционного развития с открытым исходным кодом с собственным сервером базы данных (который говорит на D) и возможностью выводить пользовательские интерфейсы из своего язык запросов.
Кроме того, появляется . Ingres по-прежнему поддерживает QUEL, и он является открытым исходным кодом.
Реляционные базы данных не являются единственным видом баз данных. Я должен сказать слово о объектных базах данных , поскольку я не видел его в ответах других. У меня был некоторый опыт работы с фреймворком Zope python, который использует ZODB для стойкости объектов вместо RDBMS (ну, теоретически возможно заменить ZODB другой базой данных в zope, но в последний раз, когда я проверил, мне не удалось
Умение ZODB действительно отличается от процесса программирования объектов, которое будет настойчивым.
ORM можно рассматривать как своего рода язык
. Я полагаю, что модель Object-database - это то, что ORM: доступ к постоянным данным через вашу обычную объектную модель. Это своего рода язык, и он набирает часть рынка, но пока мы не рассматриваем его как язык, а как слой абстракции. Однако я считаю, что было бы гораздо эффективнее использовать ORM над объектной базой данных, чем по сравнению с SQL (другими словами, производительность ORM, с которой я столкнулся, используя некоторую базу данных SQL в качестве вложенных базовых слоев).
SQL отлично подходит для домена, для которого он был разработан, - взаимосвязанных таблиц данных. Обычно это можно найти в традиционной обработке бизнес-данных. SQL не работает так, пытаясь сохранить сложную сеть объектов.
Если ваши потребности в хранении и обработке относительно традиционных данных, используйте некоторые СУБД на основе SQL.
В ответ на ваше редактирование:
Если вы ищете альтернативы SQL DML для извлечения данных из реляционных хранилищ данных, я никогда не слышал о какой-либо серьезной альтернативе SQL.
Ударные SQL-запросы, по-моему, так сильно отличаются от языка, в отличие от базовых принципов хранения данных, на которых основан язык. Люди часто путают язык SQL с реляционной моделью данных, на которой построены RDBMS.
«Я иногда слышу о том, как SQL отстой, и это не очень хороший язык»
blockquote>SQL старше 30 лет. «О том, какие функции делают что-то« хорошим »языком, а какие делают его« плохим », развивались быстрее, чем сам SQL.
Кроме того, SQL не является языком, который соответствует действующим стандартам «что нужно, чтобы быть реляционным», поэтому SQL просто не является реляционным языком для загрузки.
", но я никогда не слышал об альтернативах."
blockquote>Я предлагаю вам задуматься над тем, что вы пытаетесь услышать только в неправильных местах (то есть, в коммерческой коммерческой индустрии СУБД исключительно).
«Итак, другие хорошие языки, которые выполняют одну и ту же цель (доступ к базе данных) и что делает их лучше, чем SQL? »
blockquote>Date & amp; Darwen описывает функции, которые современный язык манипулирования данными должен соответствовать своим" Третий манифест ", последняя версия которого изложена в их книге« Базы данных, типы и реляционная модель ».
« Есть ли хорошие базы данных, которые используют t его альтернативный язык? »
blockquote>Если« добром »вы имеете в виду что-то вроде« промышленной силы », то нет. Ближайшая доступная вещь, вероятно, будет Dataphor.
Проект Rel предлагает реализацию для языка Tutorial D, определенного в «Базах данных, типах и реляционной модели», но текущая основная цель Rel должна быть образовательный характер.
Мой проект SIRA_PRISE предлагает реализацию для «действительно реляционного» управления данными, но я смущаюсь также называть его «реализацией языка».
И, конечно же, , вы также можете изучить некоторые нереляционные вещи, как это предлагали некоторые, но я лично увольняю нереляционное управление данными как многолетнюю технологическую регрессию. Не стоит рассматривать, то есть.
О, и, кстати, программная система, которая используется для управления базами данных, не является «базой данных», а «системой управления базой данных», «СУБД» для краткости , Точно так же, как фотография - это не то же самое, что камера, и если вы обсуждаете камеры, и вы хотите избежать путаницы, тогда вы должны использовать правильное слово «камеры» вместо «фотографии».
Язык запроса гибернации , вероятно, является наиболее распространенным. Преимущество Hibernate заключается в том, что объекты очень легко (почти автоматически) сопоставляются с реляционной базой данных, и разработчику не нужно тратить много времени на разработку базы данных. За дополнительной информацией обратитесь к сайту Hibernate . Я уверен, что другие будут перекликаться с другими интересными языками запросов ...
Конечно, в нем много материалов NoSQL, но вы конкретно указываете, что вас это не интересуют.
Возможно, вы думаете о критике C. Дата и его друзья высказались против существующих реляционных баз данных и SQL; они говорят, что системы и язык не являются на 100% реляционными и должны быть. Я действительно не вижу здесь настоящей проблемы; насколько я вижу, вы можете иметь 100% -ную реляционную систему, если хотите, просто дисциплинируя то, как вы используете SQL.
То, что я лично продолжаю работать, - это отсутствие выразительной мощности SQL наследует от своей теоретической основы реляционную алгебру. Одной из проблем является отсутствие поддержки для использования заказа домена, с которым вы сталкиваетесь, когда работаете с данными, отмеченными датами, отметками времени и т. Д. Однажды я попытался сделать приложение для отчетности полностью в простом SQL в базе данных, полной временных меток, и это было просто невозможно. Другим является отсутствие поддержки обхода пути: большинство моих данных выглядят как ориентированные графики, в которых мне нужно пересекать пути, и SQL не может этого сделать. (Он не имеет «транзитивного закрытия». SQL-1999 может сделать это с помощью «рекурсивных подзапросов», но я еще не видел их в действительном использовании. Существуют также различные хаки, чтобы заставить SQL справиться, но они уродливы.) Эти проблемы также обсуждается некоторыми из работ Дании, между прочим.
Недавно я был отмечен на .QL , который, как представляется, хорошо описывает проблему транзитивного замыкания, но я не знаю, он может решить проблему с упорядоченными доменами.
Взгляните на LINQ to SQL ...
Пробовал пару месяцев назад и никогда не оглядывался ....