Я звик бачити рядки таблиць із стовпцями, як-от "Видалений дат" у них, і мені це не подобається. Саме поняття "видалено" полягає в тому, що запис не слід було робити в першу чергу. Практично, їх неможливо видалити з бази даних, але я не хочу їх використовувати у своїх гарячих даних. Логічно видалені рядки, за визначенням, є холодними даними, якщо хтось спеціально не хоче бачити видалені дані.
Крім того, кожен запит, який пишеться, повинен спеціально їх виключати, а індекси також повинні враховувати їх.
Мені хотілося б побачити зміни на рівні архітектури бази даних та рівні програми: створити схему під назвою "видалено". Кожна визначена користувачем таблиця має ідентичний еквівалент у схемі "видалених" з додатковими полями, що містять метадані - користувачем, який її видалив і коли. Зовнішні ключі потрібно створити.
Далі видалення стає вставкою-видаленням. Перший рядок, який потрібно видалити, вставляється в його "видалений" аналог схеми. Рядок, про який йдеться в головній таблиці, можна видалити. Однак зайву логіку потрібно додати десь уздовж лінії. Порушення закордонних ключів можна вирішити.
Іноземні ключі повинні бути належним чином оброблені. Неправильно практично видаляти рядок, логічно видалений, але основний / унікальний має стовпці в інших таблицях, які посилаються на нього. Це ніяк не повинно відбуватися. Звичайне завдання може видаляти вдові ряди (рядки, в первинних ключах яких немає посилань в інших таблицях, незважаючи на наявність зовнішнього ключа. Це, однак, ділова логіка.
Загальна користь - це зменшення метаданих у таблиці та підвищення продуктивності. У стовпці "deleteDate" йдеться про те, що насправді цього рядка не повинно бути тут, але для зручності ми залишаємо його там і дозволяємо SQL-запиту обробляти його. Якщо копія видаленого рядка зберігається у схемі "видалених", то основна таблиця із гарячими даними має більший відсоток гарячих даних (при умові, що вони своєчасно архівуються) та меншу кількість непотрібних стовпців метаданих. Індекси та запити більше не потрібно розглядати це поле. Чим коротший розмір рядка, тим більше рядків можна розмістити на сторінці, тим швидше може працювати SQL Server.
Основним недоліком є розмір операції. Зараз замість однієї є дві операції, а також додаткова логіка та помилки. Це може призвести до більшого блокування, ніж оновлення одного стовпця в іншому випадку. У транзакції довше тримаються блокування на столі, і тут задіяні дві таблиці. Видалення виробничих даних, принаймні з мого досвіду, щось рідко робиться. Ще в одній з основних таблиць 7,5% з майже 100 мільйонів записів містять запис у стовпці "Видалено".
Як відповідь на запитання, додаток повинен знати про "відновлення". Просто потрібно було б зробити те ж саме у зворотному порядку: вставити рядок із схеми "видалено" у головну таблицю, а потім видалити рядок із "видаленої схеми". Знову необхідне додаткове оброблення логіки та помилок, щоб уникнути помилок, проблем із сторонніми ключами тощо.