Size: a a a

Clojure — русскоговорящее сообщество

2019 May 31

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Никита
В случае денормализации, как обеспечиваете целостность? Во время мутации данных делаете запрос за апдейт денормализированных полей, либо же другой вариант?
у меня есть кейс, когда денормализация является более правильным решением, чем нормализация.

Например, когда чел подписывает документ - его имя должно фиксироваться на момент подписания.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
то есть нельзя потом джоинить documents.user_id / users.id -
у юзера может потом поменяться имя, а ид его останется
источник

Н

Никита in Clojure — русскоговорящее сообщество
Никита
Как смотрите на такой вариант организации запросов к бд на связанные между собой данные.
Самый простой пример: есть продукт с айди, названием, и айди пользователя. У пользователя есть имя. Необходимо вывести список продуктов в виде названое продукта - имя продавца.

Есть два очевидных варианта - делать джоин по юзер айди, либо же денонмализировать и хранить имя пользователя в таблице продуктов (понятно что в этом примере это не совсем уместно, но допустим что у нас много джоинов происходит)

И есть третий вариант, который я недавно услышал: сначала делать запрос на список продуктов, потом из этого списка выбрать айдишники пользователей и сделать второй запрос с этим списком айди на получение пользователей

Насколько третий вариант хорош, и какие могут быть с ним проблемы?
Допустим мы все еще этот кейс крутим
источник

Н

Никита in Clojure — русскоговорящее сообщество
Когда целостность важна
источник

Н

Никита in Clojure — русскоговорящее сообщество
Просто если мы делаем обновление копий денормализированного поля во время изменения самого поля, то мы возможно будем делать много запросов
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
и то и то целостность, просто она по-разному может быть выражена :)

Так в какой у нас кейс? -
есть товары в монге, и нам надо их выбирать и писать рядом имя юзера, который загружал этот товар?
источник

Н

Никита in Clojure — русскоговорящее сообщество
Maxim Penzin
и то и то целостность, просто она по-разному может быть выражена :)

Так в какой у нас кейс? -
есть товары в монге, и нам надо их выбирать и писать рядом имя юзера, который загружал этот товар?
Да
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Никита
Просто если мы делаем обновление копий денормализированного поля во время изменения самого поля, то мы возможно будем делать много запросов
тут вопрос - сколько раз в жизни юзер меняет себе имя.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
весьма вероятно, что нисколько.
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
То есть надо систему в целом рассматривать.
источник

Н

Никита in Clojure — русскоговорящее сообщество
Но если меняет, то надо менять много где
источник

Н

Никита in Clojure — русскоговорящее сообщество
Например, его имя надо выводить во многих местах
источник

Н

Никита in Clojure — русскоговорящее сообщество
И везде это поле денормализировано
источник

Н

Никита in Clojure — русскоговорящее сообщество
Идеально конечно взять Event Sourcing
источник

Н

Никита in Clojure — русскоговорящее сообщество
Пишем в кафку а потом всякие воркеры обновляют данные в базах
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
тут с консистенси проблема
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
и это точно оверинжиниринг
источник

Н

Никита in Clojure — русскоговорящее сообщество
Maxim Penzin
и это точно оверинжиниринг
Да
источник

Н

Никита in Clojure — русскоговорящее сообщество
По этому тут надо брать 2PС например
источник

Н

Никита in Clojure — русскоговорящее сообщество
Но опять же
источник