Size: a a a

Software Design/Architecture/Zen

2021 December 06

SP

Sergey Protko in Software Design/Architecture/Zen
Сущность по определению должна иметь идентити. Иначе это не сущность. Можно конечно по ссылкам все это разруливать если твои инструменты подобное поддерживают, но тут часто проблема что мы начинаем передавать повсюду саму сущность там где хватило бы ее айдишки увеличивая связанность без явной на то причины. Так же нюансы персистанса что мол айдишка появится только после комита транзакции может сильно повлиять на логику приложения.

По сути у тебя персистанс протекает в систему. В некоторых кейсах это может и не быть проблемой
источник

SP

Sergey Protko in Software Design/Architecture/Zen
У автоинкрементов есть два варианта:

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

То есть сторадж и что он поддерживает начинает влиять на подходы
источник

🐴🐴

🐴 🐴 in Software Design/Architecture/Zen
Еще можно подумать, может быть штука до назначения id это одна модель, а штука с айдишкой это уже другое. Например, ты регистрируешь нового юзера. Можно сделать отдельно NewUserDetails (нет айдишки в принципе) и UserEntity(id обязательный атрибут)
источник

SP

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

pm

petr matukhov in Software Design/Architecture/Zen
Кажется не запрещено иметь локальный id и id из базы.

Это если вдруг вам хочется взаимодействовать с объектом про который база ещё не знает - ну например ретраить его вставку в БД если что-то пошло не так.

Это конечно так себе вариант и я сходу не могу придумать кейс в котором это бы перевесило минусы
источник

ИМ

Игорь Майоров... in Software Design/Architecture/Zen
Хороший вопрос, а что стоило бы использовать? Наверное тот же uuid, какие же ещё варианты, если других уникальных полей нет
источник

SP

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

SP

Sergey Protko in Software Design/Architecture/Zen
у uuid есть много вариантов, некоторые варианты сохраняют последовательность. Просто индекс жирнее
источник

pm

petr matukhov in Software Design/Architecture/Zen
Рабочая схема - иметь в базе два ключа - первичный автоинкремент и UUID, но это отчасти для оптимизации было сделано - чтобы явно в API можно было ссылаться UUID-ами. Опять же какие то кейсы можно так поддержать
источник

SP

Sergey Protko in Software Design/Architecture/Zen
так а в чем оптимизация? индекс на uuid тебе все так же иметь надо - все накладные расходы uuid мы тащим. Какой профит от автоинкремента тогда? Я понимаю кейс например "мы делаем сервис сокращения ссылок и хотим кодировать автоинкремент просто" но тут уже проблема что такой ключ можно угадать... свои загоны могут быть
источник

EK

Evgeniy Kuvshinov in Software Design/Architecture/Zen
а можно штук пять ключей
на каждую версию uuid свой индекс

база данных должна хранить данные и по больше
(сарказм)
источник

pm

petr matukhov in Software Design/Architecture/Zen
Автоинкремент чуть проще для внутренних джойнов, UUID - для ссылок на уровне приложения. Тоже не скажу что по красоте
источник

🐴🐴

🐴 🐴 in Software Design/Architecture/Zen
У нас, например, "новый юзер" и "юзер" это две разные штуки. Ибо есть шардинг, за который отвечает отдельный сервис, в юзер айди закодирован номер шарда.
источник

EK

Evgeniy Kuvshinov in Software Design/Architecture/Zen
а что делаете если появляется новый шард ?
источник

pm

petr matukhov in Software Design/Architecture/Zen
А задача в чем? Знать id до вставки в базу?
источник

🐴🐴

🐴 🐴 in Software Design/Architecture/Zen
Кладём новых юзеров в него.
источник

pm

petr matukhov in Software Design/Architecture/Zen
В смысле может он и не нужен ид этот, до вставки.
источник

pm

petr matukhov in Software Design/Architecture/Zen
Ну просто чтобы тривиальные случаи сразу отбросить
источник

🐴🐴

🐴 🐴 in Software Design/Architecture/Zen
Наоборот. До создания сущности и айди не нужен.
источник

pm

petr matukhov in Software Design/Architecture/Zen
Извините, путаю людей в чате
источник