SQL Server «Корзина» - PullRequest
       17

SQL Server «Корзина»

4 голосов
/ 25 июня 2010

Я создаю веб-сайт управления контентом, который также будет включать другие функции.Когда член администратора удаляет элемент через панель администратора, я бы хотел, чтобы этот элемент был перемещен в «корзину» на 30 дней (затем автоматически удален).

Каков наилучший способреализуете эту функцию?

Одна идея, которая у меня возникла, заключалась в том, чтобы в моей таблице был битовый столбец «Удален», тогда показывались только записи WHERE Hide=0.Однако это будет означать, что нужно помнить о необходимости устанавливать это условие каждый раз, когда я SELECT из таблицы.

Еще одна идея, которая у меня была, заключалась в том, чтобы иметь вторую таблицу, куда записи будут перемещаться при удалении.Однако на моем веб-сайте используется много таблиц, поэтому это может означать удвоение количества таблиц и дублирование структур таблиц (что может вызвать проблемы согласованности в будущем).

В идеале я хотел бы иметьТаблица 'RecycleBin', в которую перемещаются все записи, но она может содержать 100 столбцов, чтобы иметь возможность хранить данные из всех разных таблиц.

Если у кого-то есть какие-либо другие идеи, это было бы очень полезно.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 25 июня 2010

В большинстве известных мне реализаций используется столбец deleted (не логическое, а временная метка, чтобы вы могли определить, когда он был удален). Да, вам нужно добавить это ко всем вашим запросам, но, возможно, вы используете слой ORM, поэтому вам нужно добавить его только один раз? Я бы предложил пойти по этому пути.

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

Если вы хотите использовать одну таблицу RecycleBin, вы можете рассмотреть возможность сериализации строк и помещения их в столбец value вместо сохранения всех отдельных столбцов. Конечно, это работает, только если вам не нужно запрашивать содержимое отдельных столбцов удаленных элементов, поскольку это будет очень дорого.

0 голосов
/ 28 июня 2010

Хорошим методом является использование столбца IsDeleted.

Вы можете комбинировать это с удалением вместо триггера, который будет использовать флаг вместо обычной операции удаления. Вы также можете обернуть таблицу представлениями, чтобы в представлении отображались только не удаленные строки.

...