Скажите, что вы делаете с товарами при удалении категории, к которой они принадлежат.
category_id установить в null?
И где-то сделать список "товары без категории"?
А с подкатегориями?
Не удалять же их. Или запретить удалять категории с товарами или подкатегориями?
Не удаляю.
Максимум — софт делит.
При удалении помеченных показывать, что ссылается на элемент.