В выпуске 1.1 NuoDB мы добавили поддержку Microsoft .Net и Language INtegrated Queries (LINQ). В этой статье мы кратко рассмотрим доступ к хоккейной базе данных быстрого запуска NuoDB с помощью LINQ.
Что такое языковые интегрированные запросы?
LINQ — это инновационная технология Microsoft, представленная в 2008 году, для разработки приложений баз данных путем написания запросов непосредственно на языках программирования приложений. Вы можете спросить, в чем дело?
Как мы проиллюстрируем в этом посте, LINQ помогает уменьшить страшное несоответствие импеданса между языками программирования и системами управления базами данных, расширяя синтаксис языка программирования, так что запросы могут быть написаны непосредственно на C #, VB или другом языке программирования, поддерживаемом LINQ.
При написании приложений с использованием LINQ разработчикам не нужно переключать контекст между мышлением на языке программирования приложений и мышлением на SQL. Мы просто используем систему типов, выражения и другие конструкции в нашем языке прикладного программирования для написания наших запросов. Это позволяет с легкостью кодировать предикаты выбора, находить связи между различными объектами, агрегировать наборы результатов запросов и другие функции доступа к базе данных.
В среде Visual Studio мы также можем использовать все обычные инструменты разработчика для завершения символов, установки точек останова в отладчике и проверки значений переменных, включая результаты запросов.
Быстрый старт NuoDB в LINQ
Чтобы проиллюстрировать программирование с помощью LINQ, мы собираемся использовать базу данных быстрого старта NuoDB профессиональных хоккейных команд, игроков и статистику сезона в Северной Америке. Наша база данных быстрого старта основана на проекте Хоккейный банк данных [1] , набор данных с информацией о почти 5000 игроков и статистикой сезонов за 100 лет для этих игроков и команд, в которых они играли.
На следующей диаграмме, взятой из инструмента Visual Studio для импорта схем базы данных, мы видим 3 объекта, которые составляют схему базы данных быстрого запуска NuoDB:
- Таблица MASTER содержит биографическую информацию о каждом игроке, когда и где он родился, а также о количестве лет, в течение которых он был активен в хоккейной лиге.
- Таблица TEAMS содержит информацию о статистике сезона для каждой команды и года, включая количество сыгранных, выигранных, проигранных или проигранных в овертайме игр, итоговое положение в рейтинге и результаты плей-офф.
- Таблица подсчета очков содержит информацию о статистике сезона для отдельных игроков, позиции, в которой они играли, количестве игр, забитых мячей, количестве голов и штрафных минутах.
Обратите внимание, что SCORING представляет отношения «многие ко многим» между командами и игроками с течением времени. Поскольку игроки могут менять команды в середине сезона, атрибут STINT указывает, когда игрок играл за более чем одну команду в течение сезона.
Примечание для хоккейных фанатов: мы используем подмножество Хоккейного банка данных, полный набор данных содержит множество дополнительных статистических данных о командах и игроках, статистику целей и тренеров, награды, статистику после сезона, разделение игр и статистику команд в команде. ,
Добавление сущностей и запросов
Давайте посмотрим на некоторые конструкции манипулирования данными в LINQ.
Вот фрагмент кода для добавления новой команды в нашу примерную базу данных. Мы просто создаем новый объект C #, устанавливаем значения его атрибутов, используя обычные операторы присваивания, добавляем новый объект в коллекцию команд и сохраняем наши изменения:
testEntities ctx = new testEntities(); TEAMS team = new TEAMS(); team.TMID = "BOS"; team.YEAR = 2013; team.CONFID = "EC"; team.DIVID = "SE"; team.PLAYOFF = "0"; team.OTL = "0"; team.NAME = "Boston Bruins"; ctx.TEAMS.AddObject(team); ctx.SaveChanges();
Это было легко, но пока это не сильно отличается от кодирования с использованием инфраструктуры объектно-реляционного отображения (ORM), такой как Active Record в Ruby on Rails или Hibernate в Java. LINQ действительно хорошо подходит для написания запросов: от простого поиска в одной таблице с одним предикатом выбора до сложных запросов, которые выбирают из нескольких таблиц и агрегируют или сортируют результаты по нескольким атрибутам. В большинстве сред ORM не так просто писать нетривиальные запросы, и обычно это требует написания запроса непосредственно в SQL.
Наш первый запрос, иди Bruins!
Для нашего первого примера мы напишем простой запрос, чтобы показать рейтинг Бостонских Брюинз за каждый сезон, начиная с 2003 года:
var bostonStats = from team in ctx.TEAMS where team.TMID == "BOS" && team.YEAR > 2003 select team; foreach ( TEAMS t in bostonStats ) Console.WriteLine( t.YEAR + " " + t.TMID+” “ + t.RANK );
И вот результаты запроса. Похоже, у Брюинз в последнее время все хорошо. Как вы можете видеть с помощью LINQ, написание запроса на C # очень естественно. Выражение для выбора команд, которые мы хотим найти, является точно такой же языковой конструкцией, которую мы написали бы, если бы у нас был цикл с оператором if. Теперь это мощно и делает задачу написания приложений базы данных намного быстрее и намного менее подвержена ошибкам.
Year Team Rank 2003 BOS 1 2005 BOS 5 2006 BOS 5 2007 BOS 3 2008 BOS 1 2009 BOS 3 2010 BOS 1 2011 BOS 1
Второй запрос, игроки из Словакии?
Немного более сложный запрос показывает нам статистику очков игроков, которые родились в Словакии:
var slovakianStats = from player in ctx.MASTER where player.BIRTHCOUNTRY == "Slovakia" orderby player.LASTNAME select new { player.LASTNAME, player.FIRSTNAME, player.SCORING }; foreach (var t in slovakianStats) { Console.WriteLine(t.LASTNAME + " " + t.FIRSTNAME); foreach(var s in t.SCORING) { Console.WriteLine("\t" + s.YEAR + " " + s.TMID + " " + s.GP + " " + s.G); } }
В этом запросе мы использовали сложный тип для встраивания статистики выигрыша в каждого игрока в качестве значения player.SCORING . Вот результаты:
Baca Jergus 1990 HAR 9 0 1991 HAR 1 0 Balej Jozef 2003 NYR 13 1 2005 VAN 1 0 2003 MTL 4 0
Запрос 3, лучшие новички?
И, наконец, вот пример, показывающий код LINQ для поиска новичков, которые играли за одну из команд с самым высоким рейтингом и которые также забили выше, чем средний балл всех игроков в данном сезоне.
Инструменты IDE и LINQ
Мы можем легко установить точку останова отладки после первой части этого запроса и проверить элементы набора результатов для команд с самым высоким рейтингом в переменной winners .
Резюме
В этом кратком туре мы увидели, что написание приложений с использованием Language INtegrated Queries повышает уровень абстракции для доступа к базам данных и может помочь повысить производительность труда разработчиков на совершенно новом уровне.
Если вы еще не знакомы с последними инструментами Microsoft для разработки приложений, ознакомьтесь с ними. Следует также отметить, что LINQ доступен в других средах, поэтому, даже если вы не пишете в Windows, вы можете проверить его.
Следите за нашими будущими публикациями, в которых мы рассмотрим, как реляционные и расширенно-реляционные информационные модели сравниваются с документно-ориентированными базами данных JSON, шаблонами и анти-шаблонами для представления сложных структур данных и динамических схем в NuoDB, и другими смежными темами. ,
Пожалуйста, дайте нам знать, что вы думаете и о чем вы хотели бы, чтобы мы писали дальше.