Как создать Stripe-подобные идентификаторы БД для моделей Django?
Основная проблема, которую я пытаюсь решить: Я хочу, чтобы в моих моделях баз данных были идентификаторы, похожие на идентификаторы Stripe (т.е. в форме aaa_ABCD1234
, где ABCD1234
часть - это ULID, а aaa_
часть - это фактически имя таблицы (или его сокращенная версия)). Эта функция сэкономила мне кучу времени при отладке интеграций Stripe, и я бы хотел, чтобы пользователи моих систем могли получить те же преимущества. Однако я знаю, что использование наивного подхода и просто строки в качестве первичного ключа в таблице ужасно сказывается на производительности (в основном индексы и, как следствие, джойны, как я понимаю), поэтому я хочу воспользоваться встроенным в БД типом данных UUID, чтобы хранить в БД только часть ABCD1234
и не хранить часть aaa_
, поскольку она будет одинаковой для всех строк в этой таблице.
Где я стою сегодня
В настоящее время я думаю сделать это следующим образом:
- Иметь "приватное" поле в модели БД (назовем его
_db_id
?), которое является UUID и технически является первичным ключом модели в БД. - Имеем GeneratedField, который берет вышеупомянутое приватное поле и добавляет к нему нужный мне префикс таблицы.
При таком подходе я не могу понять, как заставить Django внутренне при всей его автоматичности использовать сгенерированное поле в качестве "открытого" первичного ключа, но использовать поле _db_id
при общении с БД, создании джойнов и т.д.
Есть ли здесь решение, которое я упустил? Есть ли лучший способ сделать это?