LINQ и SQL Server 2008
Что такое LINQ для SQL?
В течение многих лет постепенно расширялась область применения запросов к базам данных SQL Server, подготовленных в программном коде внешнего компонента, а выполненных в базе данных, и запросов, составленных, сохраненных и выполненных в базе данных (хранимая процедура). Среди разработчиков и администраторов баз данных было много споров об оптимальном методе для извлечения информации и быстрого развертывания приложений.
Большинство разработчиков старались максимально приблизить разработку запросов к приложению. Это позволяло эффективно использовать инструментарий и приемы для извлечения данных, не осваивая Transact-SQL. Кроме того, в этом случае они не зависели от группы администраторов баз данных в процессе подготовки запросов. Один из инструментов, который должен помочь разработчикам в решении этой проблемы -- средство сопоставления Object-Relational Mapper.
С помощью Object-Relational Mapper разработчики могут преобразовать данные из реляционной модели в модель на основе ссылок. В основном средства O/R Mapper позволяют разработчикам оперировать с данными как с объектами, а не объединенными строками данных из нескольких таблиц, как в реляционных моделях баз данных.
Строки таблицы существуют как элементы таблицы, содержащей строки данных, и обычно идентифицируются значениями первичного ключа и требуют набора внешних ключей для объединения с соответствующими строками данных в других таблицах. Уникальные идентификаторы объектов физически отделяют объекты друг от друга. Ссылки идентифицируют и связывают физически разделенные объекты, которые используются приложением.
Существует много различных решений для создания уровня абстракции, который функционирует как база данных при перемещении информации между представлением данных, аналогичным базам данных, и объектной моделью приложения, с переформатированием данных в процессе их перемещения в обоих направлениях. Одна из проблем при использовании этих решений заключается в том, что часто бывает невозможно запросить данные извне хранилища объектов.
LINQ to SQL -- компонент среды Visual Studio, который предоставляет разработчикам инфраструктуру для сопоставления ссылающихся объектов с реляционными данными, хранимыми в реляционных базах данных SQL Server. LINQ to SQL преобразует запросы LINQ в код Transact-SQL, выполняемый в базе данных SQL Server, а затем предоставляет методы для преобразования результатов из реляционной базы данных в необходимые приложению объекты. Благодаря LINQ to SQL разработчики баз данных могут использовать знакомую среду Visual Studio и привычные объектные модели, применяемые в программировании для запросов данных, не изучая языка Transact-SQL, составляющего основу запроса, или структуру схемы хранилища данных.
Споры о LINQ to SQL
Многие разработчики высоко оценили LINQ to SQL, и технология начала быстро внедряться в разработку баз данных, но одновременно возникли горячие споры между сообществами разработчиков и администраторов баз данных.
Основной предмет дискуссий -- не ценность LINQ to SQL для разработчиков баз данных. Центральный вопрос -- способ создания и выполнения кода Transact-SQL в запросах. Администраторы баз данных исследовали запросы, формируемые LINQ to SQL, и выяснили, что во многих случаях системные ресурсы используются неэффективно. Если неэффективные запросы неподконтрольны администраторам баз данных, то невозможно переписать код, формируемый LINQ to SQL, в отличие от хранимых процедур, используемых сегодня приложениями баз данных. Причина в том, что код Transact-SQL, сформированный LINQ to SQL, не существует вне пространства выполнения LINQ to SQL.
Неэффективные запросы всегда были проблемой для администраторов баз данных, ответственных за анализ и планирование системных ресурсов, используемых базами данных и приложениями баз данных. В прошлом у администраторов баз данных всегда была возможность оптимизировать запросы. Администраторы считают, что с появлением LINQ to SQL они лишаются этих возможностей, и будут с опозданием реагировать на проблемы использования системных ресурсов запросами LINQ to SQL. Они опасаются, что будут исключены на этапе планирования запросов, так как LINQ to SQL не формирует хранимого кода Transact-SQL, который можно проанализировать и скорректировать, устраняя неэффективные методы. Кроме того, вызывает тревогу, что в коде трудно проанализировать изменения схемы и стратегии индексации, которые играют ключевую роль в оптимизации обращений к системным ресурсам в запросах.
Именно потеря известных методологий и проблемы, связанные с кодом, формируемым LINQ to SQL, - источник споров между сторонниками LINQ to SQL и администраторами баз данных, которым приходится отвечать на телефонные звонки среди ночи, когда из-за неэффективных запросов производительность серверов баз данных падает настолько, что подключенные к ним пользователи не могут нормально работать. LINQ to SQL -- не единственный источник этой проблемы; крайне неэффективные запросы пользователей, имеющих возможность напрямую подключаться к базам данных, всегда могли быть причиной отказов серверов. Поведение LINQ to SQL может быть таким же, и многие разработчики баз данных рассматривают его как еще один инструмент, требующий осторожного обращения.
Подведем итоги
LINQ to SQL -- компонент среды Visual Studio, занимающий особое место в сложном мире проектирования баз данных. Как и для большинства инструментов, их целью не является полная замена существующих методов проектирования баз данных для современных реляционных баз данных, хотя многие считают такую замену желательной. Не несет он и угрозы стабильности среды баз данных и полномочиям администратора по защите ресурсов серверов баз данных, хотя многие придерживаются такого мнения. У инструмента есть своя область применения, для которой он предназначен, и достоинства, отсутствующие в любом другом решении.
Споры о LINQ to SQL между администраторами и разработчиками будут продолжаться до тех пор, пока инструмент не преодолеет болезнь роста или не станет еще одним средством разработки, отвергнутым администраторами баз данных. Но пока неясно, кто победит, и разработчикам и администраторам предстоит отстаивать свое мнение и вести дискуссии о новом компоненте Visual Studio в течение многих месяцев.