Я изо всех сил пытаюсь найти лучшие практики для архитектуры моего проекта Spring.
В настоящее время наша компания имеет большую схему базы данных, которая используется во многих проектах, и мы используем только подмножество, точнее 10 таблиц. Наше приложение использует слой DAO для доступа к этим таблицам.
Таблицы обычно составляются таким образом, чтобы они имели флаг активности, отметку времени и флаг состояния рядом со всеми другими атрибутами.
Наши DAO слои автоматически связывают jdbcTemplate (мы не используем ORM). Теперь возникает первая проблема: многие из наших уровней DAO имеют обычные операции CRUD + множество «методов обновления», и DAO становится раздутым. Для каждого нового варианта использования нам нужно добавить новый метод для интерфейса и реализации. Визуальная демонстрация:
public class Employee {
private Integer id;
private Integer first;
private Integer second;
private Integer third;
private Integer foreignId;
private Integer sts;
private Integer activityMark;
private Timestamp tstam;
}
public class EmployeeDao {
Employee get(Integer id);
Collection<Employee> getAll();
void remove(Integer id);
void updateFirst(Integer id);
void updateSecond(Integer id);
void updateThird(Integer id);
void updateSts(Integer id);
....
}
Другой вариант - использование одного метода обновления, но для этого требуется другой ненужный запрос (выбор всего) из базы данных.
Вторая проблема состоит в том, что у нас есть много (анемичных доменов) моделей (сущностей), которые не следуют дизайну таблицы - некоторые сложные модели с атрибутами из многих таблиц, некоторые сводные модели - только с некоторыми атрибутами из таблицы. Их дизайн также несовместим, иногда мы используем композицию и агрегирование, например:
public class ModelOne {
private ModelTwo m2;
private ModelThree m3;
}
и иногда только с атрибутами внешнего ключа или необходимости.
и у них также есть соответствующие методы в DAO. Иногда они имеют свой собственный интерфейс и реализацию DAO, а иногда они все вместе с основной моделью DAO. Мы пытаемся сбалансировать между DAO на основе таблиц и моделей.
Наконец, у нас мало сервисов, которые автоматически связывают DAO, и это нарушает принцип единой ответственности.
Я прочитал много статей, много обсуждений, но мне кажется, что ни одна из них не дала хорошего решения моих проблем.
Извините за длинную историю, но я буду благодарен за любой совет.