Здравствуйте. Мне нужно создать сущность кредитного предложения с полями:
o Клиент
o Кредит
o Сумма кредита
o График платежей:
▪ Дата платежа
▪ Сумма платежа
▪ Сумма гашения тела кредита
▪ Сумма гашения процентов
Под сущность будет создана таблица и в неё будут заноситься строки. Но как быть с полем графика платежей? Т.к. у него есть 4 подпункта не понимаю как её реализовать.
В моём понимании надо под каждое кредитное предложение генерировать и заполнять свою таблицу и каким-то образом делать join с полем. Но как? Или это вообще не так делается?
Daniil Shadrin
27 уровень
Вопрос по Spring и SQL
Обсуждается
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
8 мая 2021, 21:32
Ниже в принципе расписали основные моменты, от себя добавлю, что я вижу два основных сценария.
Первый, если это (лучше чтобы ты конечно расписал заранее, в вопросы касающиеся джава ее, спринга, бд всегда нужно добавлять побольше инфы, а то либо расспрашивать, либо описывать все кейсы - и то и то забирает время отвечающих и твое, на уточнения), если это тестовое задание на работу/учебное , можно обычный ООП дизайн, есть энтити:
Таким образом будет связь 1-m,
в самой БД, в табличке credit_offers будет только
client_id
credit_id
credit_sum
а в табличке credit_payments (имя можно и получше придумать, чтобы не путать с реальными платежами по кредиту, scheduled_credit_payments длинновато вроде, это уже детали)
будут поля
date
sum
principal_repayment
interest_repayment
credit_offer_id
и собственно FOREIGN KEY на кредитное предложение, тогда будет некая нормализация данных, поскольку можно писать и в одну таблицу, но это означало бы дублирование информации, часть полей у нас логически относятся к одной сущности, часть к другой.
Для тестового задания/учебной задачи этого хватило,
все остальное в коде спринг бы сделал сам, тебе нужно было только создать таблички в sql и замапить энтити.
Другой вариант относительно реальных сценариев, там отталкиваются от бизнес контексте.
Какие данные будут чаще писаться,
Клиент, Кредит, Сумма кредита или График платежей?
Как часто меняется график платежей, может он раз пишется и все, а может 100 раз пересчитывается. Какая информация чаще всего будет запрашиваться, по кредитному предложению или по графику, какой объем данных, на каких технологиях планируется персистенс леер, jdbc,hibernate/spring data,jooq, , Spring Data JDBC и тд, какая БД используется
+2
Justinian Judge в Mega City One Master
8 мая 2021, 21:44
а дальше вариантов масса, среди самых простых,
1) хранить все в одной таблице, преимущество - меньше джойнов, чуть лучше производительность, недостаток - дублирование данных, на больших объемах база может раздуваться этими дублирующими данными
2) записать объект JSON в поле типа стринг, а в самом коде конвертить, опять же, меньше джойнов и лучше рпоизводительность, но меньшая гибкость в работе, необходимость дополнительной логики конвертации, если нужно искать по этим данным (график платежей), это будет очень медленно
3) есть БД которые поддерживают JSONB поля. Это поле, которое хранит JSON, отличием от предыдущего варианта то, что конвертеры к примеру для спринг дата или хибернейта писать не нужно, хибернейт сам его преобразует в нужную сущность + на уровне БД полям объекта лежащего в JSONB можно проводить поиск на уровне запросов
и тд в зависимости от того, на чем базируется или может базироваться персистенс лейер.
+ сама структура сущностей, твоя сущность CreditOffer имеет два джойна на Client и Credit + будет на Paymentы, вроде не так много на глаз, но если структура сложнее, Кредит свои джойны имеет, Клиент свои, а там еще свои, то это уже вопрос.
Но на реальных проектах, джуны такие вопросы обычно не решают ) либо делают как скажут, либо есть с кем посоветоваться как лучше скажут. Если это учебный или тестовое, много не ждут, помни принцип KISS/YAGNI, делай на две сущности, делай маппинг энтити да и все.
+2
Daniil Shadrin
15 мая 2021, 05:47
Благодарю за развернутый ответ
0
Роман
8 мая 2021, 09:11
График платежей - String у сущности доменного слоя, она в бд храниться как строка (json), в программу из внешнего слоя ты получаешь Dto, где график платежей - отдельный объект с полями, получив его - jacksonom его преобразуешь в String и сохраняешь в поле String сущности доменного слоя, далее сохраняя в бд как строку, когда из бд достаешь график платежей в виде строки, то преобразуешь обратно в объект dto и т.д., а отдельную таблицу для этого использовать или нет, тут сам уже смотри
0
Daniil Shadrin
8 мая 2021, 09:22
Как в таком случае распарсить строку обратно в объект? Просто делать сплит строки по какому-то символу?
0
Роман
8 мая 2021, 10:17
так же jackson
0
hidden #2322530
8 мая 2021, 11:43
Зачем использовать String для того, где правильней использовать самостоятельный объект?
В будущем это сложнее будет расширять и поддерживать. вдруг надо будет отчет потом дописать, где будет фильтрация или поиск только по отдельным полям? или надо будет добавить/убрать ещё одно поле. как ты будешь нормализацию делать?
Ксения ниже уже правильно подсказала, делаем ещё один класс, который будет лежат в отдельной таблица по полям.
0
Ksenia Volkova Java Developer в DXC Master
8 мая 2021, 08:46
Например, график - в отдельной таблице, связанной с Предложением как one-to-many
+1
Daniil Shadrin
8 мая 2021, 09:25
Тоже об этом подумал. Но тогда получается все платежи всех клиентов будут лежать в отдельной таблице? А вытаскиваться нужные будут, например по id кредитного предложения, верно?
А правильный ли это подход, если например будет 1.000.000 клиентов, у каждого будет в среднем по 12 записей в графике платежей, они все будут лежать в одной таблице. Получается будет таблица с 12.000.000 записей, в которой при каждом запросе нужно будет найти те самые, коотрые связаны one-to-many именно с этим кредитным предложением. Или я что-то не понимаю?
0
Ksenia Volkova Java Developer в DXC Master
8 мая 2021, 11:18
Ну базы данных - они для того и создаются, чтобы хранить большие объемы данных. И для оптимизации в них используются всякие специальные штуки - та же индексация.
Кроме того, многое зависит от задач твоего приложения - то есть, что именно тебе с этими данными нужно делать.
Если просто показать пользователю график платежей - то можно хранить в виде строки, как выше написали, без всяких дополнительных таблиц.
Но если банк, к примеру, захочет получить сведения об ожидаемых платежах за март будущего года? или решит отправлять смс-напоминания клиентам накануне очередного платежа? Тогда от такой структуры будет мало пользы.
Исходи из задач, которые нужно будет решать.
+2