В настоящее время у нас есть база данных и приложение, которое полностью функционально. У меня нет возможности изменить архитектуру на этом этапе. Сегодня каждая таблица в базе данных имеет поле «IsDeleted» NOT NULL BIT со значением по умолчанию «0». Когда приложение «удаляет» данные, оно просто обновляет флаг IsDeleted до 1.
Что мне трудно понять, так это то, как индексы в каждой из таблиц должны быть структурированы. Прямо сейчас каждый запрос / соединение / и т. Д. Всегда реализует проверку IsDeleted. Это стандарт, которому должны следовать наши разработчики. При этом я пытаюсь определить, нужно ли изменить все мои кластерные индексы первичного ключа в каждой из таблиц, чтобы включить первичный ключ И поле IsDeleted BIT. Кроме того, так как каждый запрос / присоединиться / и т. Д. должен реализовывать проверку IsDeleted. Является ли уместным предположение, что КАЖДЫЙ ОДИН индекс (также не кластеризованный) должен включать поле IsDeleted в качестве первого поля индекса?
Еще один вопрос, который у меня есть, касается отфильтрованных индексов. Я понимаю, что я мог бы наложить фильтры на индексы, такие как "WHERE IsDeleted = 0", чтобы уменьшить размер индексов. Однако, поскольку в каждом соединении / запросе должна быть реализована проверка IsDeleted, помешает ли это использованию отфильтрованного индекса (поскольку в соединении / запросе используется столбец IsDeleted)?
Помните, у меня нет возможности изменить подход IsDeleted.
IsDeletedстолбца, независимо от физического хранилища, возможно, имеет смысл выставить данные через два представления (необязательно в разных схемах), решая как проблему параметризации, так и ошибки при доступе к данным, которые не должны были доступ менее вероятен. Доступ к базовым данным имеет отношение только к тем редким случаям, когда удаленные и не удаленные данные необходимо каким-либо образом объединять, и когда строки действительно необходимо переключить на «удаленные».