Size: a a a

Software Design/Architecture/Zen

2020 October 11

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
2 чото не оч понятно о чем речь, по 1 пути бы сделал.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
денормализация с целью повышения быстродействия. норм подход.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
он о том где это делать
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
В БД это будет в таблице "thread" в обоих случаях.

Вопрос как сделать на уровне кода.

1) В сущности Thread добавить эти поля и сохраняться будет через ORM.

2) В сущности не делать, будет репозиторий сам сохранять эти значения и использоваться они будту только в модельках, которые для чтения, которые без ORM собираются.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
при сохранении комментария обновлять счетчик, и айди последнего коммента. ну или кидать событие, которое при обработке это сделает.
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Ну то есть второй вариант
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
2 путь откуда данные будет брать эти? запросом считать?
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
У репозитория метод addComment, который сохранить в таблицу comment сам комментарий и в таблице thread для ветки обновит поля last_comment_id, comments_count.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
ну да, в модели для записи наверное эти поля можно не делать. внутренняя штука. они считаются автоматически, менять их произвольно возможности быть не должно
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Сергей Предводителев
Добрый день!

Есть темы и комментарии к ним.

С точки зрения чтения часто нужен последний комментарий и общее количество комментариев в теме.

Чтение/запись по коду отделены.

Запись идёт через ORM.

Как лучше сделать:

1) В сущности темы сделать свойства "Последний комментарий" и "Количество комментариев".

2) В репозитории, который сохраняет комменты ручками записывать к теме последний комментарий и количество комментарий и использовать эти поля только в read-модельках.

?
ну в целом, я бы начал с вопроса а есть ли у нас проблемы с производительностью если мы делаем тупо выборку без необходимости денормализации. Например с postgresql я в целом сходу не смогу сказать что будет быстрее - денормализация и джойны или отдельный запрос с DISTINCT ON. Для конкретно этого кейса я бы сгенерил себе лям комментов и потестил перформанс - если с индексами производительность будет в пределах моих предположений я бы так и оставил.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
Сергей Предводителев
У репозитория метод addComment, который сохранить в таблицу comment сам комментарий и в таблице thread для ветки обновит поля last_comment_id, comments_count.
да, выглядит норм. почему у тебя сомнения на этот счет?
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Алексей Гевондян
да, выглядит норм. почему у тебя сомнения на этот счет?
Только не давно познал разделение чтение и записи :)
Поэтому пока во многом сомневаюсь
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Sergey Protko
ну в целом, я бы начал с вопроса а есть ли у нас проблемы с производительностью если мы делаем тупо выборку без необходимости денормализации. Например с postgresql я в целом сходу не смогу сказать что будет быстрее - денормализация и джойны или отдельный запрос с DISTINCT ON. Для конкретно этого кейса я бы сгенерил себе лям комментов и потестил перформанс - если с индексами производительность будет в пределах моих предположений я бы так и оставил.
Резонно. Но допустим, что пришли к тому, что денормализировать надо... тогда как лучше сделать?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Сергей Предводителев
Добрый день!

Есть темы и комментарии к ним.

С точки зрения чтения часто нужен последний комментарий и общее количество комментариев в теме.

Чтение/запись по коду отделены.

Запись идёт через ORM.

Как лучше сделать:

1) В сущности темы сделать свойства "Последний комментарий" и "Количество комментариев".

2) В репозитории, который сохраняет комменты ручками записывать к теме последний комментарий и количество комментарий и использовать эти поля только в read-модельках.

?
если же чисто из спортивного интереса - скорее всего для записи комментариев у меня был бы отдельный агрегат который бы выступал и репозиторием для комментов (через persisted collections ORM) и в целом бы поддерживал актуальный стэйт базы.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
если чтение из thread очень частое, комментов много, то получать sql-ем эти значения может быть слишком дорого, тогда имеет смысл сделать денормализацию.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
конкретно в этом кейсе вариантов оч много просто потому что любой вариант в целом будет работать - тут достаточно низкие риски что стэйт будет не консистентным (ты всегда можешь в транзакцию завернуть) и тут не нужны локи особо (ну затрется ну и ладно).

Но скорее всего я бы кидал доменный ивент что коммент для такой-то темы был запощен и строил бы по этим ивентам отдельную проекцию. Тут тебе уже нужны будут какие-то гарантии что ивент дойдет до проектора. В этом случае все будет надежно с точки зрения стэйта но могут запаздывать апдейты для UI.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
ну и еще вариант - тригеры в базе :)
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
при сохранении коммента генерить событие об этом, и обновлять темы через очередь. т.к. возможны проблемы с конкуренцией.
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
Если событие - очередь - обработка, то получается какое-то время данные будут не консистенты
источник

СП

Сергей Предводителев... in Software Design/Architecture/Zen
В одной транзакции по идее должно же бтыь
источник