Должен ли я иметь новую сущность для каждого вида запросов к базе данных? - PullRequest
0 голосов
/ 20 октября 2018

Есть ли лучший способ избежать огромного количества DTO и сущностей?

Сейчас в моем приложении есть несколько сущностей и DTO для каждой таблицы базы данных.Однако, поскольку запросы из пользовательского интерфейса сильно различаются, я создал новые сущности и DTO для каждого из запросов, что привело к аду DTO-Entity.

Возьмите этот пример:

Несмотря на то, что наше приложение очень простое и имеет только две таблицы базы данных:

  • Таблица персон с идентификатором, именем, возрастом, vehicle_id;
  • Таблица транспортных средств с идентификатором, брендом, скоростью, ценой;

Отправной точкой является то, что у нас есть только следующие классы:

  • PersonEntity, PersonDto, VehicleEntity, VehicleDto

Пользователь может получить Persons, Vehicle по идентификатору и имени.Пока все просто.

Но мы получили новое требование:

Пользователь хочет запросить среднюю цену транспортного средства по именам людей.(т.е. транспортные средства, принадлежащие всем франкам, имеют среднюю цену 25,213 $). Таким образом, на стороне пользовательского интерфейса нам нужен один объект: PersonGrouppedAvgPrice с полями personName и averagePrice

Я нашел следующие решения:

  1. Таким образом, мы либо выбираем всю личность с заданными именами и соответствующими автомобилями из БД и возвращаем ее в пользовательский интерфейс (и вычислениепроизойдет со стороны пользовательского интерфейса), что приводит к ненужному сетевому трафику и потреблению памяти, но по крайней мере мы не обязаны создавать новые объекты.

  2. Мы по-прежнему получаем все, как указано выше, изБД и сделать расчет на стороне сервера на уровне DTO.В этом случае мы все еще не обязаны создавать новую сущность, но мы должны создать новую DTO.Сетевой трафик снижается, но память все еще остается высокой.

  3. Мы создаем соответствующую логику на уровне DAO с помощью запроса:
    select p.name, avg (v.цена) из person_table в качестве p-внутреннего соединения ... и т. д. В этом случае мы получаем только необходимую информацию, которая наиболее эффективна, но в этом случае нам нужны новые DTO и сущности.

Я использовал третий.Но из-за различных запросов пользовательского интерфейса количество новых классов возросло до уровня, на котором он станет не поддерживаемым в будущем.Для 20 таблиц базы данных мне пришлось создать ~ 4-4 Entity и DTO, то есть ~ 160 классов.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 20 октября 2018

Точка 3 - правильный подход для RDMBS.Вы должны использовать запросы для выполнения этой работы в базе данных, так как передача всех данных таблицы с сервера базы данных на сервер приложений будет неэффективной.

Для каждого пользовательского запроса, который требует специализированной проекции, вы можете получить дополнительныеDTO классы.Это не обязательно неправильно, это поможет с написанием юнит-тестов.Существует несколько способов уменьшить количество классов DTO, например, с помощью кортежей , как описано в этой статье .

...