SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Внешние зависимости (как провязать клиента и базу на этапе разработки)
Внешние зависимости [сообщение #5049] Wed, 15 May 2024 14:53 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Firebird поддерживает концепцию зависимостей своих внутренних объектов, и это прекрасно. За любое движение, нарушающее согласованность метаданных, бьют по рукам. Это иногда приводит к необходимости дополнительных телодвижений, но то и правильно.

Также зависимости между частями проекта поддерживают среды разработки и компиляторы, на которых разрабатывают клиенты для СУБД. Просто так модуль из песни не выкинешь, мамка (среда) и папка (компилятор) заругают.

А вот связи между разрабатываемым клиентом и базой остаются на совести (на плечах, в руках, в памяти) программиста. Если совести или памяти мало-мало, возможны неприятности, обнаруживаемые только во время исполнения, и то не сразу и не всегда. Запросы к базе, прописанные в проекте клиента, должны точно соответствовать структуре базы, и никакая автоматика за этим не следит, все глазами и руками.

Что хотелось бы? Чтобы был такой робот, который взял бы структуру базы с одной стороны, вытащил бы из клиента все возможные обращения к базе с другой, сравнил и погрозил бы пальцем - ай-ай-ай, вот тут, тут и тут ерунда. Нет такой   таблицы/представления/процедуры /поля.

Вопросов 2:

1. А вы как поддерживаете связи? Просто тестированием или еще как?

2. Может, есть такие инструменты, а я и не знаю? Интересует в первую очередь Delphi и Java. В принципе, можно и самому подумать-придумать-сделать, но это думать и делать надо.

[Обновления: Wed, 15 May 2024 14:58]

Известить модератора

Re: Внешние зависимости [сообщение #5050 является ответом на сообщение #5049] Wed, 15 May 2024 15:01 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
тут бы было интересно заслушать Женю Болтика.
у него, если не ошибаюсь, все запросы лежат в базе, а не влинкованы в прогу в виде ресурсов.
также сделано, если не ошибаюсь, в системе "Гедымин".
но у них там и ресурсы формы лежат в базе, а не линкуются как *.dfm
тем самым всегда имеет место быть непротиворечивое сопряжение фронтэнда с бэкэндом.

[Обновления: Wed, 15 May 2024 15:01]

Известить модератора

Re: Внешние зависимости [сообщение #5051 является ответом на сообщение #5050] Wed, 15 May 2024 15:14 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
МП писал(а) Wed, 15 May 2024 15:01
все запросы лежат в базе
Интересная мысль. Я что-то похожее делаю для вставок и изменений. Все возможные insert и update оформляю в виде процедур и просто вызываю эти процедуры с параметрами, когда нужно.

Но этот подход (запросы в базе) сам по себе не особо-то помогает для решения задачи согласованности запросов и структуры. Хранить же можно и кривые запросы, это ж просто строки или что там. Другое дело, что тогда можно сделать инструмент сверки чисто средствами Firebird, но то еще повозиться надо.
Re: Внешние зависимости [сообщение #5053 является ответом на сообщение #5051] Wed, 15 May 2024 17:51 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Обычно если хотят железнобетонно привязать БД к коду приложения используют всяческие ORM с подходом code-first.
Когда структура БД генерируется и обновляется по коду модели в приложении.

Насчёт Delphi не знаю, а вот в Java и NET это довольно распространённый подход
Re: Внешние зависимости [сообщение #5055 является ответом на сообщение #5051] Thu, 16 May 2024 10:14 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время в онлайне  pastor
Сообщений: 81
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
shalamyansky писал(а) Wed, 15 May 2024 15:14
Хранить же можно и кривые запросы, это ж просто строки или что там. Другое дело, что тогда можно сделать инструмент сверки чисто средствами Firebird, но то еще повозиться надо.
можно препарировать при сборе дистра
Re: Внешние зависимости [сообщение #5056 является ответом на сообщение #5055] Thu, 16 May 2024 15:30 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Wed, 15 May 2024 17:51
всяческие ORM с подходом code-first
Да, в случае ORM указанная проблема мало актуальна. Не буду поднимать волну холивара про и контра ORM, у всего есть свои плюсы и минусы, скажу только, что сам придерживаюсь концепции database-first и ищу решение именно для таких проектов.

В самом узком и наиболее частом применении задача выглядит так. Есть база, к которой определены несколько десятков процедур. Эти процедуры вызываются несколькими клиентами с разных платформ и разным функционалом. В порядке рефакторинга структуры базы возникает подозрение, что некоторые из них давно уже никому не нужны. Могу я их безопасно удалить? Вот и вопрос.

Это описана зависимость в обратную сторону, от базы к клиенту. Нужны и прямые зависимости: вызываю с клиента процедуру, а есть такая в базе? Это второй вопрос.

pastor писал(а) Thu, 16 May 2024 10:14

можно препарировать при сборе дистра
Да, препарирование как метод валидации. Тоже думаю в эту сторону. По крайней мере прямую зависимость можно проверить.
Re: Внешние зависимости [сообщение #5057 является ответом на сообщение #5056] Thu, 16 May 2024 15:36 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky писал(а) Thu, 16 May 2024 15:30
В порядке рефакторинга структуры базы возникает подозрение, что некоторые из них давно уже никому не нужны. Могу я их безопасно удалить? Вот и вопрос.
сперва их надо "спрятать" и дать настояться.
спрятать можно например в пакет (PACKAGE), либо переименованием.
если юзеры прибегут с криками "шеф, всё пропало!", значит удалять не надо.
Re: Внешние зависимости [сообщение #5058 является ответом на сообщение #5057] Thu, 16 May 2024 15:41 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
МП писал(а) Thu, 16 May 2024 15:36
сперва их надо "спрятать" и дать настояться
Да, это классический метод. Но жить хочется так, чтобы от криков уши не закладывало.
Re: Внешние зависимости [сообщение #5060 является ответом на сообщение #5058] Thu, 16 May 2024 15:55 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
вместо юзеров можно гонять unit-тесты, UI-тесты.
но это затраты человеко-часов на написание и поддержание системы тестов.
многие предпочитают не заморачиваться.
M$ вообще расформировала отдел бета-тестирования.
Re: Внешние зависимости [сообщение #5061 является ответом на сообщение #5057] Thu, 16 May 2024 15:55 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время в онлайне  pastor
Сообщений: 81
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
МП писал(а) Thu, 16 May 2024 15:36

если юзеры прибегут с криками "шеф, всё пропало!", значит удалять не надо.
31 декабря с годовым отчетом.

и 23 числа каждого месяца на отчислениях персоналу

PS через два месяца после закрытия сезона со сверкой с Яндексом или Расчетными решениями

[Обновления: Thu, 16 May 2024 15:57]

Известить модератора

Re: Внешние зависимости [сообщение #5062 является ответом на сообщение #5049] Thu, 16 May 2024 16:09 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Тесты - это хорошо и правильно. Вопрос - как узнать о несогласованности до (читаем - вместо) тестов? В сильном варианте вообще неплохо было бы, чтобы система ругалась на создание несогласованных вызовов, как это делает, например, Firebird внутри своих баз.

shalamyansky писал(а) Wed, 15 May 2024 14:53

1. А вы как поддерживаете связи? Просто тестированием или еще как?
Re: Внешние зависимости [сообщение #5063 является ответом на сообщение #5062] Thu, 16 May 2024 16:17 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
ну, мож кто и напишет такой инструмент.
в своё время все смеялись над "анализатором кода" для Delphi, а человек таки написал.
и даже заработал на этом.
Re: Внешние зависимости [сообщение #5064 является ответом на сообщение #5063] Thu, 16 May 2024 17:11 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Цитата:
В самом узком и наиболее частом применении задача выглядит так. Есть база, к которой определены несколько десятков процедур. Эти процедуры вызываются несколькими клиентами с разных платформ и разным функционалом. В порядке рефакторинга структуры базы возникает подозрение, что некоторые из них давно уже никому не нужны. Могу я их безопасно удалить? Вот и вопрос.
Лично я в таких случае делаю поиск по исходникам/настройкам.

Ну или можно заморочиться и сделать себе генератор части исходников приложения по структуре БД. Или сделать в приложении автодокументация по исходникам, где сразу можно проверить наличие того или иного объекта метаданных
Re: Внешние зависимости [сообщение #5065 является ответом на сообщение #5064] Thu, 16 May 2024 17:16 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Понял, что ниша открыта, и готовых инструментов на горизонте не видно. Уже хорошо (что понял).

Спасибо всем за обсуждение!
Re: Внешние зависимости [сообщение #5081 является ответом на сообщение #5065] Sun, 19 May 2024 16:10 Переход к предыдущему сообщениюПереход к следующему сообщению
Саня, привет! в настоящее время не в онлайне  Саня, привет!
Сообщений: 3
Зарегистрирован: May 2024
Junior Member
shalamyansky писал(а) Thu, 16 May 2024 17:16
Понял, что ниша открыта, и готовых инструментов на горизонте не видно. Уже хорошо (что понял).

Спасибо всем за обсуждение!
Вот оно вам надо. Схема базы меняется редко. Поменял -  погонял тесты, отдал заказчику, пофиксил возникшие претензии и живи себе дальше. А изначально строить приложения вокруг колченогой идеи - да ну нафиг.
Ну, завернешь ты запросы в процедуры. А что делать с запросами, формируемыми динамически, как ты их при компиляции проверишь? Отказаться от них?
Re: Внешние зависимости [сообщение #5082 является ответом на сообщение #5081] Mon, 20 May 2024 06:09 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 162
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
Динамические запросы формируются по шаблон, а значит имеется шаблон и генератор вариантов.
Комбинаторный взрыв такой схеме не грозит, а значит можно, как минимум, проверить основные варианты.
Re: Внешние зависимости [сообщение #5084 является ответом на сообщение #5082] Mon, 20 May 2024 11:30 Переход к предыдущему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
основных вариантов может быть овер-дофига.
так что без полноценных unit-тестов никуда.

зы: оно конечно всё зависит от сферического коня и уровня упругости вакуума.
Предыдущая тема: Странность с исключениями в EB
Следующая тема: Параметры транзакций в PHP
Переход к форуму:
  


Текущее время: Thu Nov 21 18:52:38 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01184 секунд