Каскадное удаление в каталоге товаров

stopkran

Дилетант
Кто-нибудь использует его вообще, это каскадное удаление? Я его как-то боюсь.

Например: есть категории товаров "Серёжки золотые", "Серёжки серебряные" и "Серёжки прочие"; пользователь решил, что "Прочие" в каталоге не нужны и удалил эту категорию; потом пользователь спохватился и решил, что "Прочие" можно просто распихать по "Пластмассовым", "Свинцовым" и "Деревянным"; но вместе с категорией, оказывается, он уже удалил все элементы этой категории!

Является ли интуитивно очевидным, что при удалении какой-либо категории будут удалены все элементы этой категории? Или пользователь чаще ожидает, что категория - это просто наклейка, которую можно сменять, удалять, не трогая самих товаров?
 

С.

Продвинутый новичок
Не надо гадать. Надо просто четко писать: "Удалить товар", "Удалить категорию вместе с товаром", "Удалить категорию, оставить товар"
 

Andkorol

Новичок
Предпочитаю в таких случаях вообще ничего не удалять физически – можно просто поставить соответствующий флаг для "удаляемого" элемента, что-то вроде `deleted` = 1.
Для озабоченных размерами таблиц в БД – можно выносить такие "удаленные" элементы в отдельную таблицу (сохраняя привязки к разделам/группам каталога).
Оба способа позволяют без особых проблем всё восстановить.
 

С.

Продвинутый новичок
Вопрос не о том, как иметь возможность восстанавливать, а как делать так, чтобы пользователь понимал. что он делает. Тогда "ах-ох!" не будет и восстанавливать ничего не придется. А чего мусор-то за собой таскать, даже если и диска у тебя много.
 

Andkorol

Новичок
чтобы пользователь понимал. что он делает. Тогда "ах-ох!" не будет и восстанавливать ничего не придется.
Довольно часто те, кто принимает решение об удалении раздела/группы, и те, кто непосредственно это осуществляет – разные люди.
И в таких ситуациях не так уж редки случаи, когда "руководитель" передумал/поторопился/не_согласовал/получил_люлей – и дает "исполнителю" команду "быстренько сделать всё, как было".
Задача разработчика, на мой взгляд – такие ситуации предусмотреть, и сделать процесс восстановления простым и удобным для исполнителя.
(да, я в курсе про бэкапы и т.п. – но это нормально реализовано/работает далеко не везде)
 

stopkran

Дилетант
(да, я в курсе про бэкапы и т.п. – но это нормально реализовано/работает далеко не везде)
Не, ну у меня бэкапы нормальные (сохранить таблицу или все таблицы просто, как Ctrl+s). И во всех инструкциях это один из первых пунктов, и словами пользователей стараюсь грузить и запугивать, чтоб сохраняли почаще.

Так что, в общем, согласен с С.:
Надо просто четко писать: "Удалить товар", "Удалить категорию вместе с товаром", "Удалить категорию, оставить товар"
Буду думать, как это всё реализовать поаккуратнее.
 

A1x

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

Redjik

Джедай-мастер
Пробовал много - ко многим... вылезли непредвиденные косяки...
Один из - хлебные крошки.
Если товар в нескольких категориях, то как показывать? не по рефереру же...
 

Redjik

Джедай-мастер
Вот поэтому проще сделать has_many и в полседствии добавить еще один параметр в свойства товара...
я делал many_many для новинок, спец предложений и т.п. в итоге переделала все и добавил 2 datetime поля - new_until, special_until и has_many для категорий
 

isqad

isqad88
Пробовал много - ко многим... вылезли непредвиденные косяки...
Один из - хлебные крошки.
Если товар в нескольких категориях, то как показывать? не по рефереру же...
У вас не передается id(или slug) категории товара при переходе с этой категории на товар?



вообще по теме, все зависит от требований. Но самый хороший вариант, делать юзабилити сайта таким, чтобы юзер понимал, что он делает нажатием кнопки "Удалить". Так что вопрос этот относится к качеству дизайна, а по архитектуре обычно делают каскадное удаление. Чтобы связанные записи не "висели" в базе.
Есть еще set null когда требуется чтобы записи в любом случае оставались, все зависит от требований.
 

Redjik

Джедай-мастер
isqad
я тоже не сеошник =)
несколько различных урлов для одной страницы будет
 

isqad

isqad88
Тогда лучше отказаться от дублирования товаров в категориях. То есть связи многие ко многим
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Если товар в нескольких категориях, то как показывать?
я сделал так:
в URL передается ID категории, через которую юзер зашел на страницу товара - в сотмаркете от категории зависит вывод характеристик товара,
но ID категории передавать необязательно - у товаров есть поле "дефолтная категория", которая используется при заходе на товар по ссылке без категории

если вывод товаров не зависит от категории и надо избежать дублирование ссылок - или формируй ссылку на товар без категории, вида /products/[name].html, или 302

По теме: при удалении категории товары не должны удаляться, это разные сущности. Если удалить все категории, в которые входит товар, он все еще может быть доступен по прямой ссылке, и это есть seo-friendly.
 

Redjik

Джедай-мастер
grigori
ага подобным образом тоже делал, а как у вас sitemap.xml с этим дружит?
только дефолтные попадают?

ЗЫ. и по сабжу ... в любом случае товары не удаляю... если много ко многим - удаляю свзяь, если один ко многим - ставлю null
 
Сверху