Как правильно организовать структуру базы данных для товаров и дерева категорий?
Здравствуйте!
Помогите, пожалуйста, разобраться.
Использую MySQL (InnoDB) и PHP.
Есть интернет магазин, в нем товары и категории.
products
id (PRIMARY)
title
price
category_id (foreign key on delete set null)
categories
id (PRIMARY)
title
parent_id
Категории иерархические с неограниченным уровнем вложенности.
На одной странице, я вывожу сразу все дерево категорий и подкатегорий. Список динамичный, можно добавлять новые, перетаскивать (менять уровень вложенности), удалять, изменять.
Сейчас, для добавления, я собираю массив из дерева категории и разом вставляю в таблицу.
Но возникла проблема с добавлением и изменением дерева категорий:
1. Если удаляется категория в списке
2. Если меняется уровень вложенности
3. Если меняется только название категории
Категорий будет не много и я вначале подумал, что можно каждый раз, при сохранении категорий, удалять все в таблице categories и добавлять заново. Но потом дошло, что будут меняться id категорий и соответственно, значение category_id в таблице products будет неверным.
Подскажите, пожалуйста, какой можно использовать шаблон базы данных или пример того, чтобы все правильно реализовать.
Slava Rozhnev, Собственно вопросы:
1. Если удаляется категория в списке
2. Если меняется уровень вложенности
3. Если меняется только название категории
Зациклился на реализации через PHP и думал, что неправильная структура таблиц, но как и бывает, задал вопрос и начал понимать, что нужно логику переделать. Спасибо, что откликнулись!
1. Если удаляется категория в списке - foreign set null (или default)
2. Если меняется уровень вложенности - менять только order у дерева
3. Если меняется только название категории - только название и менять
Лев Салатов, А если логику переделывать, то можно попробовать categories держать неизменными. Добавить таблицу category_tree.
Но если категорий немного, то это избыточно, наверное.
iljaGolubev, т.е. Вы имеете в виду в categories хранить только title и order, а category_tree будет связующей между category_id и parent_id? В чем будет выгода? Может под текущее, небольшое количество категорий будет избыточно, но мне будет полезно знать)