13
Организация интерфейса
Таблицы и триггеры
чтение данных напрямую из таблицы (представления);
запись данных напрямую в таблицу (представление),
плюс триггеры для изменения связанных таблиц
приложение должно быть в курсе модели данных,
максимальная гибкость
сложно поддерживать согласованность
Функции
чтение данных из табличных функций;
запись данных через вызов функций
приложение отделено от модели данных и ограничено API
большой объем работы по изготовлению функций-оберток,
потенциальные проблемы с производительностью
Есть несколько способов организации интерфейса между клиентской
и серверной частями приложения.
Один вариант — разрешить приложению напрямую обращаться
к таблицам в базе данных и изменять их. При этом от приложения
требуется детальное «знание» модели данных. Отчасти это требование
можно ослабить за счет использования представлений (view).
Кроме того, от приложения требуется и определенная дисциплина —
иначе очень сложно поддержать согласованность данных, защищаясь
на уровне БД от любых возможных некорректных действий
приложения. Но в этом случае достигается максимальная гибкость.
Другой вариант — запретить приложению доступ к таблицам
и разрешить только вызовы функций. Чтение данных можно
организовать с помощью табличных функций (которые возвращают
набор строк). Изменение данных можно выполнять, вызывая другие
функции и передавая им необходимые данные. В этом случае внутри
функций можно реализовать все необходимые проверки
согласованности — база данных будет защищена, но приложение
сможет пользоваться только предоставленным и ограниченным
набором возможностей. Такой вариант требует написания большого
количества функций-оберток и может привести к потере
производительности.
Вполне возможны и промежуточные варианты. Например, разрешить
чтение данных непосредственно из таблиц, а изменение выполнять
только через вызов функций.