База данных SQL Server - скрытые поля? - PullRequest
1 голос
/ 09 сентября 2009

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

Кто-нибудь знает способ сделать это с базой данных SQL Server?

Помощь с благодарностью.

Ответы [ 6 ]

9 голосов
/ 09 сентября 2009

Вы можете добавить еще один столбец в таблицу «удаленных», который имеет значение 0 или 1, и отображать только те записи с удаленными = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

Вы также можете создать представление, в котором будут только не восстановленные строки.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

И ваша команда удаления будет выглядеть так:

UPDATE TheTable SET deleted = 1 WHERE id = ...
2 голосов
/ 09 сентября 2009

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

2 голосов
/ 09 сентября 2009

Расширяя идею Лукаша, столбец datetime также полезен.

  • NULL = текущий
  • Значение = при мягком удалении

Это добавляет простое управление версиями, что битовый столбец не может, который может работать лучше

0 голосов
/ 09 сентября 2009

Раствор с триггерами

Если вы дружите с триггером БД, вы можете подумать:

  • добавить DeletedAt and DeletedBy столбцы в ваши таблицы
  • создает представление для каждой таблицы (например: для таблицы Customer имеет представление CustomerView, которое отфильтровывает строки, у которых DeletedAt не равно нулю (идея gbn со столбцами даты)
  • все ваши операции CRUD выполняются как обычно, но не на таблице Customer, а на CustomerView
  • добавить INSTEAD OF DELETE триггер, который пометит строку как удаление вместо физического удаления.
    • вы можете захотеть сделать немного более сложные вещи, например, убедиться, что все ссылки FK на эту строку также «логически» удалены, чтобы все еще иметь логическое ссылочную целостность

Если вы решите использовать этот шаблон, я, вероятно, назвал бы мои таблицы по-другому, например TCustomer,, а для ясности клиентского кода просто просматривал Customer.

0 голосов
/ 09 сентября 2009

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

Альтернативным предложением было бы добавить дополнительное присвоение статуса, если существует уже существующий код состояния. Например, в приложении посещаемости класса, которое мы используем для внутреннего использования, запись о посещении может быть «Импортирована», «Зарегистрировано», «Завершено», «Не завершено» и т. Д. * - мы добавили опцию «Удалено» для случаев непреднамеренного дублирования , Таким образом, у нас есть запись, и мы не просто добавляем новый столбец при проблеме.

* Это отображаемое имя для числового кода, используемого за кулисами. Просто уточняю. :)

0 голосов
/ 09 сентября 2009

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

...