В приложении C ++, которое может использовать практически любую реляционную базу данных, каков наилучший способ создания запросов, которые можно легко расширить, чтобы учесть эксцентриситеты движка базы данных?
Другими словами, коду может потребоваться извлекать данные способом, который не согласован между различными механизмами баз данных. Каков наилучший способ разработки кода на стороне клиента для генерации запросов таким образом, чтобы сделать поддержку нового механизма базы данных относительно безболезненным делом.
Например, если у меня есть код (MFC), который выглядит следующим образом:
CString query = "SELECT id FROM table"
results = dbConnection->Query(query);
и мы решили поддержать некоторую базу данных, которая использует «AVEC» вместо «FROM». Теперь всякий раз, когда пользователь использует этот механизм базы данных, этот запрос не будет выполнен.
Вариантов пока:
- Наихудший вариант: заставить код, выполняющий запрос, проверять тип базы данных.
- Лучший вариант: создать метод запроса запроса для объекта подключения к БД, который принимает уникальный код запроса и возвращает соответствующий запрос на основе используемого механизма базы данных.
- Опция Betterer: создайте класс построителя запросов, который позволит вызывающему объекту создавать запросы без непосредственного использования SQL. После завершения запроса вызывающая сторона может вызвать метод «Generate», который возвращает строку запроса apppripriate для активного механизма базы данных
- Лучший вариант: ??
Примечание. Сам движок базы данных абстрагируется от тонких слоев нашего собственного творения. Именно сами запросы являются единственной оставшейся проблемой.
Решение:
Я решил использовать «лучший» вариант (запрос «селектор») по двум причинам.
- Отладка : Как упомянуто ниже, отладка будет немного проще с подходом селектора, так как запросы предварительно собраны и перечислены в читабельной форме в коде.
- Гибкость : Мне пришло в голову, что есть некоторые базы данных, которые могут иметь значительно лучшие и совершенно разные способы решения определенного запроса. Например, с помощью Access я выполняю сложный запрос к нескольким таблицам каждый раз, потому что должен, но на Sql Server я бы хотел настроить представление. Выбор из представления и из нескольких таблиц - это совершенно разные запросы (я думаю), и этот селектор запросов легко справится с этим.