Доброго времени суток. Я newbie, потому по нехватке знаний и практики довольно трудновато принимать правильные решения. Сейчас бьюсь с интересной задачей - реализовать базу данных каталога товаров с категориями и подкатегориями (иерархия), да и так чтобы один и тот же товар мог входить в несколько категорий. База тестовая - ТЗ от потенциального работодателя. На пальцах как бы все понятно, 3 таблицы - дерево_каталогов, список_товаров, отношения_между_товаром_и_каталогом. Для хранения иерархии каталога решил использовать алгоритм вложенных множеств (nested sets), который уже давно известен и довольно отточен. Таблицы выглядят примерно так:
-- дерево каталога
CREATE TABLE categories(
cat_id INT(11) NOT NULL AUTO_INCREMENT,
cat_name VARCHAR(255) NOT NULL,
cat_parent INT(11) NOT NULL,
left_child INT(11) NOT NULL,
right_child INT(11) NOT NULL,
cat_level TINYINT(1) NOT NULL,
PRIMARY KEY(cat_id),
INDEX left_child(left_child, right_child, cat_level)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- список товаров
CREATE TABLE articles(
art_id INT(11) NOT NULL AUTO_INCREMENT,
art_name VARCHAR(255) NOT NULL,
art_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
PRIMARY KEY(art_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- отношения между товаром и категориями каталога
CREATE TABLE links(
art_id INT(11) NOT NULL,
cat_id INT(11) NOT NULL,
INDEX art_id (art_id),
INDEX cat_id (cat_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
Именно таблица "links" и отвечает за "наполнение" категорий товаром, в ней все связи.
Так вот вопрос, насколько оптимален такой подход в данном случае, если производить нужно только выборку? И как можно организовать хранение отношений товара к категориям другим способом?
Отредактированно Midnight (13.01.2013 15:06:04)