Я работаю над клиентским приложением C # ( SlimTune Profiler ), которое использует механизмы реляционных (и потенциально встроенных) баз данных в качестве своего резервного хранилища. Текущая версия уже имеет дело с SQLite и SQL Server Compact, и я хотел бы поэкспериментировать с поддержкой других систем, таких как MySQL, Firebird и так далее. Хуже того, я бы хотел, чтобы он поддерживал плагины для любого другого резервного хранилища данных - и не обязательно те, которые в идеале основаны на SQL. Завершая процесс, сам интерфейс поддерживает плагины, поэтому у меня есть неизвестное сопоставление «многие ко многим» между запросом кода и механизмами, обрабатывающими запросы.
В настоящее время запросы в основном обрабатываются с помощью необработанного кода SQL. Я уже столкнулся с проблемами, заставляя сложные SELECT работать портативно. Со временем проблема может только усугубиться, и это даже не учитывает идею поддержки данных, отличных от SQL. Итак, каков наилучший способ опрашивать дико разрозненные движки разумным способом?
Я рассмотрел что-то на основе LINQ, возможно, проект DbLinq . Другой вариант - это постоянные объекты, например, Subsonic . Но я не слишком уверен, что там, каковы ограничения, или я просто надеюсь на слишком много.
(Кроме того, из-за неизбежного вопроса о том, почему я не остановлюсь на одном движке. Мне нравится давать пользователю выбор механизма, который лучше всего работает для него. SQL Compact позволяет выполнять репликацию на полный экземпляр SQL Server. SQLite является переносимым и поддерживает базы данных в памяти. Я могу представить себе ситуацию, когда компания хочет добавить плагин MySQL, чтобы они могли с легкостью хранить и сопоставлять данные о производительности приложения с течением времени. И, наконец, самое главное, я нахожу Идея, что я должен зависеть от деталей реализации моего базового движка базы данных, абсурдна.)