Эта статья будет посвящена тому, как реализовать в базе данных MySQL категории интеренет магазина. Нетрудно понять, что без категорий никак нельзя, мы ведь не хотим, чтобы в одном списке оказались товары никак не связанные между собой, к тому же разбиение товаров на категории позволяет упростить для пользователя поиск нужных товаров.
Если вы уже прочитали предыдущую статью о таблице товаров интренет-магазина, то у вас уже есть база данных. Создадим в ней еще одну таблицу categoryes:
CREATE TABLE IF NOT EXISTS `categoryes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
`category_name` varchar(255) NOT NULL,
`category_alias` varchar(255) NOT NULL,
`description` text NOT NULL,
`category_image` varchar(255) NOT NULL,
`meta_keywords` varchar(255) NOT NULL,
`meta_description` varchar(255) NOT NULL,
`meta_title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
В ней всего восемь полей:
- id – уникальный идентификатор категории
- parent_id – идентификатор родительской категории
- category_name – название категории (можно было бы просто name, но дальше будет понятно почему лучше назвать именно category_name)
- category_alias – алиас категории для ЧПУ
- description – описание категории
- category_image – изображение категории
- meta_keywords и meta_description – ключевые слова и мета описание категории
- meta_title – заголовок категории (необязательное поле).
Обратите внимание, что в таблице нет короткого описания категории. В принципе, если очень хочется – можно его добавить, но вообще говоря, можно же просто обрезать полное и добавить ссылку подробнее на странице списка категорий, или вообще не выводит описание в этом списке. Еще одно поле, которое может вызвать некоторое замешательство – parent_id, но здесь нет ничего сложного. Если вам необходимо создать несколько уровней каталога товаров, можно привязать одну категорию к другой через поле parent_id. Таким образом первый уровень обозначается parent_id=0, а остальные – соответственно идентификаторами родительских категорий.
Теперь в нашем интернет-магазине, которого еще нет, есть таблица категорий. Дальше нужно научиться привязывать товары к категории или категориям. Для этого создадим еще одну таблицу product_category:
CREATE TABLE IF NOT EXISTS `img_product_category` (
`product_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
В ней всего два поля product_id которое соответствует идентификатору товара из таблицы products и category_id – идентификатор категории из таблицы categoryes. Зачем так сложно? На будущее. Конечно можно было бы просто добавить в таблицу products поле category_id, но тогда мы бы потеряли некоторые приятные и удобные вещи, которые дает нам такая реализация. Например, мы сделали возможность добавления дочерних категорий. А вот теперь представим, что мы добавляем товар в такую дочернюю категорию, соответственно, если у нас в таблице products есть ячейка category_id, мы присвоим ей значение идентификатора дочерней категории. Теперь мы выводим список товаров из родительской категории запросом:
$q=”SELECT * FROM products WHERE category_id=’идентификатор_родительской_категории’”;
и естественно нашего товара в ней не окажется. Можно конечно сначала извлечь товары из родительской категории, а потом извлечь идентификаторы дочерних категорий, и извлечь товары дочерних категорий, что значительно увеличит объем кода, необходимого для вывода всех товаров категории. А вот когда у нас связка товар-категория в отдельной таблице, все просто:
$q=”SELECT * FROM products, product_category WHERE product_category.category_id=’нужная_категория’ AND product.id=product_category.product_id”;
Такой запрос выберет из таблицы products все товары из нужной категории.
На этом пока остановимся. Кстати, предложенных в этой и предыдущей статье таблиц хватит для того, чтобы создать простенький каталог продуктов без возможностей интернет-магазина.