Где JDBC-совместимое приложение должно хранить свои операторы SQL и почему?
Пока мне удалось выделить эти варианты:
- Жестко закодированы в бизнес-объектах
- Встроено в предложения SQLJ
- Инкапсулировать в отдельные классы, например, объекты доступа к данным
- Управляемые метаданными (отделите схему объекта от схемы данных - опишите сопоставления между ними в метаданных)
- Внешние файлы (например, файлы свойств или ресурсов)
- Хранимые процедуры
Каковы «плюсы» и «против» каждого из них?
Следует ли считать код SQL «кодом» или «метаданными»?
Следует ли использовать хранимые процедуры только для оптимизации производительности или они являются законной абстракцией структуры базы данных?
Является ли производительность ключевым фактором при принятии решения? А как насчет привязки к поставщику ?
Что лучше - слабая связь или тугая и почему?
РЕДАКТИРОВАТЬ: Спасибо всем за ответы - вот резюме:
Управляемые метаданными, то есть объектно-реляционные сопоставления (ORM)
Плюсы:
- Очень абстрактно - сервер БД можно переключить без изменения модели
- Широкое распространение - практически стандарт
- Сокращает количество необходимого SQL
- Может хранить SQL в файлах ресурсов
- Производительность (обычно) приемлемая
- Подход, основанный на метаданных
- (База данных) независимость от поставщика
Минусы:
- Скрывает SQL и истинные намерения разработчиков
- SQL сложно проверить / изменить администратором баз данных
- SQL может все еще понадобиться в нечетных случаях
- Может принудительно использовать собственный язык запросов, например HQL
- Не поддается оптимизации (абстракция)
- Может не хватать ссылочной целостности
- Заменители из-за незнания SQL или недостаточной заботы о коде в БД
- Никогда не соответствовать производительности собственной базы данных (даже если она близка)
- Код модели очень тесно связан с моделью базы данных
Жестко закодированы / инкапсулированы в слое DAO
Плюсы:
- SQL хранится в объектах, которые обращаются к данным (инкапсуляция)
- SQL легко писать (скорость разработки)
- SQL легко отследить, когда требуются изменения
- Простое решение (без запутанной архитектуры)
Минусы:
- SQL не может быть просмотрен / изменен администратором баз данных
- SQL, скорее всего, станет специфичным для БД
- SQL может стать трудно поддерживать
Хранимые процедуры
Плюсы:
- SQL хранится в базе данных (близко к данным)
- SQL анализируется, компилируется и оптимизируется СУБД
- SQL легко проверить / изменить
- Снижает сетевой трафик
- Повышенная безопасность
Минусы:
- SQL привязан к базе данных (привязка к поставщику)
- Код SQL сложнее поддерживать
Внешние файлы (например, файлы свойств или ресурсов)
Плюсы
- SQL можно изменить без необходимости перекомпоновки приложения
- Отделяет логику SQL от бизнес-логики приложения
- Центральный репозиторий всех операторов SQL - проще в обслуживании
- Легче понять
Минусы:
- Код SQL может стать не обслуживаемым
- Сложнее проверить код SQL на наличие (синтаксических) ошибок
Встроено в предложения SQLJ
Плюсы:
- Лучшая проверка синтаксиса
Минусы:
- Слишком тесно связан с Java
- Производительность ниже, чем у JDBC
- Отсутствие динамических запросов
- Не так популярно