Разделение записи товара в БД на слои кода
От: zelenprog  
Дата: 15.09.23 08:50
Оценка:
Здравствуйте!

В предыдущей теме я спрашивал про валидацию:
https://rsdn.org/forum/design/8586755
Автор: zelenprog
Дата: 24.08.23


Теперь вопрос более общий, по "архитектуре".
Назначение программы — загрузка ("консолидация") в новую базу данных товаров из нескольких других старых баз.
Одному товару в новой базе может соответствовать товары из нескольких старых баз. Так как пользователи разных подразделений вели свои отдельные базы, хотя по сути это один и тот же перечень товаров.

Общий алгоритм следующий:
1) Выгружаем из базы-источника товары в файл передачи
2) В новой базе читаем файл передачи из конкретной n-ой базы-источника.
3) По разным реквизитам (наименование, штрихкод) пытаемся установить соответствия между товарами из текущей базы и из базы-источника.
Это соответствие между товарами пока что "логическое".
4) Выводим пользователю таблицу, разделенную на две части:
— в левой колонке товар из текущей новой базы (или пустота, если не найдено соответствие)
— в правой колонке товар из старой базы (или пустота, если не найдено соответствие)
— поля для признаков "проверен", "записывать", "записан" (при первом заполнении они пустые)
5) Пользователь смотрит на эту таблицу, проверяет данные:
5.1) Если пользователь убеждается, что соответствие установлено верно и товар надо загружать, он включает флажки "проверено", "записывать".
При этом в базу записывается "жесткое" фиксированное соответствие: GUID товара из старой базы, GUID товара из новой базы, признак "записывать" = "Да".
5.2) Если пользователь убеждается, что соответствие установлено верно и товар не надо загружать, он включает признак "проверено", "записывать" выключает.
В базу записывается "жесткое" фиксированное соответствие: GUID товара из старой базы, GUID товара из новой базы, и признак "записывать" = "Нет".
5.3) Если соответствия нету, и пользователь решает, что товара из старой базы еще нету в новой базе, он включает признаки "проверено", "записывать".
Это значит, что в новой базе надо создать новый товар на основании товара из старой базы.
В базу записывается просто GUID товара из старой базы и признак "записывать" = "Да".
6) Пользователь нажимает кнопку "Записать".
Для каждой строки из списка выделенных строк:
— выполняется проверка флажков "проверен" и "записан", если флажки установлены, то выполняется:
— запись информации о товаре в базу
— запись в таблицу "Флажки" признака "записан" и GUID товара из старой базы, чтобы при повторной работе скрыть уже записанные товары.

Получается, структура БД должна быть такой:
— Таблица "Товары"
— Таблица "Соответствие"
— Таблица "Флажки"

Следует обратить внимание, что алгоритм записи товара для пункта (5.1) (когда есть соответствие) отличается от алгоритма записи для пункта (5.3) (когда соответствия нету).
По пункту (5.1) надо перезаписать товар в новой базе информацией из старой базы.
По пункту (5.3) надо в новой базе создать новый товар на основании информации о товаре из старой базы.

При нажатии на кнопку "Записать" для пункта (5.1) алгоритм записи следующий (соответствие предварительно зафиксировано в таблице "Соответствия"):
— Перезаписываем поля в таблице "Товары" для GUID из таблицы соответствия
— Записываем признак "Записан".
При нажатии на кнопку "Записать" для пункта (5.3) алгоритм записи сложнее (соответствие предварительно не зафиксировано, и его надо зафиксировать в процессе записи):
— Создаем новый товар, запоминаем его GUID
— Записываем этот GUID в таблицу "Соответствие", а также GUID старого товара
— Записываем признак "Записан".
— Обновить в интерфейсе таблицу соответствия, так как появился новый товар, и его нужно там "нарисовать".

Вопрос такой.
По идее, разные алгоритмы записи (5.1) и (5.3) дожлны быть реализованы на уровне слоя бизнес-логики. Верно?
Ведь слой доступа к базе "тупой", он ведь не должен знать что и как надо записывать.
Как в методе "Записать" базнес-логики выполнить алгоритм (5.3) в одном "запросе" и обеспечить целостность транзакции?
Какой класс бизнес-логики это должен делать?
В общем вопросов много, так как опыта мало.
Подскажите, пожалуйста.

Также не понятно по классам.
Вроде бы ясно, что нужен класс "ТоварНоваяБД", "ТоварСтараяБД".
А вот надо ли создавать отдельно класс, который "хранит" информацию о соответствии и работает с ней?

Как дать понять интерфейсу, что создан новый товар, соответствующий товару из старой базы, и что надо дорисовать таблицу на форме?
В общем по п. (5.3) получается какая-то запутанная бизнес-логика.
Отредактировано 15.09.2023 9:08 zelenprog . Предыдущая версия . Еще …
Отредактировано 15.09.2023 9:03 zelenprog . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.