в нашей схеме базы данных нам нравится использовать флаги удаления. Когда запись удаляется, мы обновляем это поле, а не выполняем оператор удаления. Затем остальные наши запросы проверяют наличие флага удаления при возврате данных.
Вот проблема:
Флаг удаления - это дата со значением по умолчанию NULL. Это удобно, потому что когда запись удалена, мы можем легко увидеть дату, когда она была удалена.
Однако, чтобы правильно применить уникальные ограничения, нам нужно включить флаг удаления в уникальное ограничение. Проблема в том, что в MS SQL он ведет себя в соответствии с тем, что мы хотим (для этой схемы), но в postgresql, если какое-либо поле в многостолбцовом уникальном ограничении равно NULL, оно разрешает это поле. Такое поведение соответствует стандарту SQL, но нарушает наш дизайн.
Варианты, которые мы рассматриваем:
установить значение по умолчанию для удаленного поля в качестве некоторой жестко закодированной даты
добавить битовый флаг для удаленного, тогда каждая таблица будет иметь 2 связанных поля удаления - date_deleted и is_deleted (например)
изменить дату_установлено на is_deleted (битовое поле)
Я подозреваю, что вариант 1 - это снижение производительности, каждый запрос должен проверять жестко заданную дату, а не просто проверять IsNUll. Плюс это неправильно.
Вариант 2 также кажется неправильным - 2 поля для «удаленных» не являются сухими.
Вариант 3, мы теряем информацию о «дате». Существует измененное поле, которое теоретически будет отражать дату удаления, но только при условии, что последнее обновление строки было обновлением бита удаления.
Итак, есть предложения? Что вы сделали в прошлом, чтобы справиться с «удалением флагов»?
Обновление
Спасибо всем за супер быстрые и вдумчивые ответы.
Мы закончили с простым логическим полем и измененным полем даты (с триггером). Я только что заметил предложение частичного индекса, и это выглядит как идеальное решение для этой проблемы (но я на самом деле не пробовал)