Хранение информации различных типов в базе данных

Тип столбца — часть контракта данных. Он должен выражать допустимые значения, нужную точность и операции, а не только «вмещать текущий пример».

ДанныеПредпочтительный типЛовушка
идентификаторinteger, UUID или доменный ключсмешивание ключа и отображаемого номера
деньгиdecimal / numericдвоичный float даёт ошибку округления
измерениецелое в минимальной единице или decimalпотеря единиц
текстvarchar / text с явной кодировкойдлина в символах и байтах различается
датаdateхранение строкой
момент временитип timestamp с согласованной зоной/UTCпотеря смещения и неоднозначность
перечислениеограниченный текст, справочник или enumневозможность безопасно расширить
полуструктурные данныеJSONпревращение всей схемы в непрозрачный документ
бинарные данныеbinary / BLOBрост БД и тяжёлые резервные копии

null, пустая строка, ноль и «неизвестно» — разные состояния. Их смысл надо определить в модели, а не исправлять в каждом запросе.

JSON или отдельные столбцы

JSON полезен для редко читаемых, изменчивых атрибутов и входного документа. Отдельные столбцы лучше для обязательных полей, связей, фильтрации, индексов и ограничений целостности.

Если по JSON-полю строятся ключевые отчёты и внешние ключи, данные уже фактически имеют схему — стоит выразить её явно.

Хранение медиафайлов

В БД как BLOB: единая транзакция, контроль доступа и резервное копирование вместе с метаданными; минусы — размер, нагрузка на журнал и сложное масштабирование.

В объектном хранилище, в БД — ключ: удобна раздача больших объектов и независимое масштабирование; нужно решать согласованность, удаление сирот, права и проверку целостности.

Ссылка должна быть не случайным временным URL, а устойчивым идентификатором объекта. Полезно хранить размер, MIME-тип, checksum и состояние загрузки.

Самопроверка

  • Почему деньги нельзя бездумно хранить в double?
  • Когда JSON перестаёт быть удачным выбором?
  • Какие новые отказы появляются при раздельном хранении файла и метаданных?