Идиоматический haskell для абстракции базы данных - PullRequest
9 голосов
/ 27 апреля 2011

На языках ООП я мог бы написать оболочку базы данных, которая инкапсулирует соединение с базой данных, управляет схемой и обеспечивает несколько основных операций, таких как exec, query, prepare_and_execute. Я мог бы даже иметь отдельный вспомогательный класс базы данных, который обрабатывал бы схему базы данных, оставляя абстракцию базы данных только для обработки соединений. Затем это будет использоваться моделями-обертками / фабриками, которые используют класс абстракции базы данных для создания экземпляров классов моделей. Что-то вроде этой UML-диаграммы:

Каков предпочтительный способ разработки такой системы в идиоматическом хаскеле?

Ответы [ 2 ]

5 голосов
/ 27 апреля 2011

Наиболее используемая библиотека абстракций базы данных в Haskell - HDBC . Это означает, что запросы просто представлены как String с заполнителями. Меньше людей используют HaskellDB , который обеспечивает безопасный для типов способ создания запросов. Ничто не запрещает иметь пользовательские типы данных для представления общих запросов и настраиваемые функции для их построения.

Значения в Haskell неизменны, это означает, что бесполезно иметь изменяемый объект, соответствующий записи в базе данных. Вместо этого я думаю, что более распространенным является определение пользовательских типов данных и функций, которые собирают и переносят / переносят значения этих типов в / из базы данных.

Всякий раз, когда необходимы обновления базы данных, они могут запускаться в какой-то монаде с состоянием в IO. Это позволит, например, сохранить соединение открытым или сделать что-то между запросами.

Наконец, функции первого класса, так что можно создавать все функции на лету. Таким образом, сама функция может инкапсулировать любую информацию, которую вы хотите.

Итак, я думаю, что обычный подход на Haskell состоит из

  • алгебраические типы данных для представления фактических данных (в виде неизменных значений)
  • остальная часть приложения для преобразования этих значений
  • функции, которые генерируют запросы (инкапсулируют детали схемы, маршалируют данные в / из типов данных Haskell)
  • (опционально) монада с состоянием для выполнения запросов (скрыть детали доступа к базе данных)
  • функции, которые выполняют запросы (скрыть детали доступа к базе данных)
2 голосов
/ 26 апреля 2013

Самый идиоматичный способ использования Haskell для баз данных, и самый эффективный, IMHO, это кэширование записей в памяти и использование STM в транзакциях памяти, так что вы используете базу данных для хранения. Затем вы можете использовать транзакционные переменные (TVar) для управления записями. Но вы должны определить свой собственный язык запросов, и вам нужен механизм для кэширования / не кэширования и синхронизации. Это то, что делают Java, EJB3 и Hybernate.

Пакет TCache определяет постоянные DBRef, переменные STM с семантикой TVar . Они могут быть частью записи и указывать на другую запись, и они легковесны, так что вы можете разработать собственную абстракцию над ней. Он также имеет SQL-подобный язык запросов, включая поиск по полю, объединения и полнотекстовый поиск. Он имеет постоянство по умолчанию в файлах. Вам нужно только определить ключ для вашей записи на Haskell, и у вас есть постоянство файла. Для сохранения базы данных существует класс IResource, в котором вы определяете операции чтения, записи и удаления для ваших записей. Каждая запись может иметь свое постоянство. Таким образом, все взаимодействия с базой данных находятся в одном месте исходного кода, а транзакции в памяти на несколько порядков быстрее. TCache записывает связное состояние каждый раз, когда асинхронно записывает в базу данных. Он также может писать синхронно.

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