2009-06-18 2 views
0

Вот моя ситуация. У меня есть следующие таблицы:Лучшая практика для работы с удаленными строками таблицы?

  • Продукт,
  • продукта Атрибут,
  • Заказать товар (ссылается на PRODUCT_ID и Order_ID),
  • Атрибут Заказ товара (ссылки order_product и product_attribute).

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

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

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

ответ

3

Не разрешайте «удалять по ошибке» ... просто используйте флаг «active» или «inactive» в качестве столбца в таблице атрибутов продукта.

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

0

Добавить триггер в таблицу, чтобы предотвратить удаление атрибутов использования?

ИЛИ

Добавить удаленный флаг в эту таблицу и установить флаг, а не на самом деле удалить строку. Добавьте IsDeleted = False в предложение where любых запросов, которые обращаются к таблице атрибутов для выбора.

+0

Я тоже это рассмотрел, но вижу примечание внизу. Что бы вы сделали в этом случае? Похоже, что подобные подобные вещи довольно распространены. –

3

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

Конечно, если вы все еще хотите (в некоторых случаях) разрешить это, вы можете отключить проверку foreign_key_.

+0

+1 Полностью согласен. Фактически я бы оставил все проверки внешнего ключа включенными все время - вы никогда не хотите, чтобы продукт ссылался на неопределенный атрибут. Если вам нужно удалить этот атрибут продукта, сначала его нужно удалить из всех существующих продуктов. –

Смежные вопросы