Как лечше реализовать уровень 2 в BD?

12
seosniks
На сайте с 13.08.2007
Offline
389
985

Подскажите пожалуйста как реализовать уровень вложения 2 для товара.

Например есть у меня сейчас в базе данных таблица разделов

CREATE TABLE `razdel` (

`catid` int(255) NOT NULL auto_increment,
`category` varchar(25) default NULL,
`title_cat` varchar(100) default NULL,
PRIMARY KEY (`catid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

--
-- Дамп данных таблицы `razdel`
--

INSERT INTO `razdel` VALUES (1, 'auto', 'Автомобили');

Категория автомобили должна иметь подкатегории, шины, музыка, оборудование.

И так далее.

Вот и думаю как проще сделать возможность добавления подкатегории.

Подскажите пожалуйста.

Есть такой вариант

CREATE TABLE `subcategories` (

`id` int(2) NOT NULL default '0',
`title` varchar(255) default NULL,
`parent_id` int(2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `subcategories`
--

INSERT INTO `subcategories` VALUES (1, 'Подкатегория1.1', 1);
INSERT INTO `subcategories` VALUES (2, 'Подкатегория1.2', 1);
INSERT INTO `subcategories` VALUES (3, 'Подкатегория2.1', 2);
INSERT INTO `subcategories` VALUES (4, 'Подкатегория2.2', 2);
INSERT INTO `subcategories` VALUES (5, 'Подкатегория3.1', 3);

CREATE TABLE `categories` (
`id_c` int(2) NOT NULL default '0',
`title_c` varchar(255) default NULL,
PRIMARY KEY (`id_c`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `categories`
--

INSERT INTO `categories` VALUES (1, 'Категория1');
INSERT INTO `categories` VALUES (2, 'Категория2');
INSERT INTO `categories` VALUES (3, 'Категория3');

но стоит ли так делать?

jozzeff
На сайте с 18.07.2010
Offline
4
#1

Не совсем понимаю, в чем осложнение, вы, вроде, все верно делаете.

PHP-MySQL — профессионально разрабатываю приложения (скрипты) (/ru/forum/523032) jozzeff.ru (http://www.jozzeff.ru) Нужна простенькая и очень недорогая CMS? (http://www.jozzeff.ru/2010/08/08/mini-cms/)
FladeX
На сайте с 07.11.2008
Offline
163
#2

Я обычно все делаю в одной таблице. Поля у неё - id категории, название категории, id родительской категории. id родительской категории равен 0, если эта категория первого уровня, и id другой категории, если та является родительской для данной.

Услуги посредника на бирже контента: информационные статьи 40₽/1000, «продающие» тексты 50₽/1000. Пишите в личку. Помогаю правильно переехать на https (/ru/forum/973447). Подписывайтесь на мой канал в телеграм: https://t.me/fladex (https://t.me/fladex).
Qinghua
На сайте с 01.09.2009
Offline
103
#3

таблица№1 для категории

таблица№2 для подкатегорий

таблица№3 для их связей

если связь строго 1к1, то возможен ваш вариант.

maldivec
На сайте с 04.11.2008
Offline
160
#4
Qinghua:
таблица№1 для категории
таблица№2 для подкатегорий
таблица№3 для их связей

Ну и чем это обосновано? Очень негибкий вариант, а вдруг мне нужно будет еще один уровень вложенности добавить? Еще одну таблицу создавать? :D

Я делаю именно так, как описал FladeX и никаких проблем. Любой уровень вложенности, любое количество связей и никаких сложных запросов для 3 таблиц.

Qinghua
На сайте с 01.09.2009
Offline
103
#5
FladeX:
Я обычно все делаю в одной таблице. Поля у неё - id категории, название категории, id родительской категории. id родительской категории равен 0, если эта категория первого уровня, и id другой категории, если та является родительской для данной.

Да, если категория и подкатегория одинаковые сущности (напр. есть статьи и на машины и на шины), то лучше всего так. Если не 1к1, то связи в отдельную таблицу.

Qinghua добавил 19.07.2010 в 13:03

maldivec:
Ну и чем это обосновано?

По умолчанию категория и подкатегория это разные вещи (как я понял, так как не указано). Как папки и файлы. Тут смотря что у ТС.

maldivec
На сайте с 04.11.2008
Offline
160
#6
Qinghua:
Да, если категория и подкатегория одинаковые сущности (напр. есть статьи и на машины и на шины), то лучше всего так.

Ну 99% это одинаковые сущности.

Qinghua:
Если не 1к1, то связи в отдельную таблицу

Несогласен. Если связи "1 ко многим" (что, кстати, соответствует данному примеру :) ), то тоже отдельную таблицу? Таблица связей нужна только при связях "многие ко многим", на сколько я себе все это представляю. Да и какой смысл подкатегории иметь несколько родителей? Это же не облако тегов.

Qinghua
На сайте с 01.09.2009
Offline
103
#7
Да и какой смысл подкатегории иметь несколько родителей?

Чтобы не дублироваться. Шины могут относится и к автомобилям и к мотоциклам.

Часто, связи и названия категорий и подкатегорий лучше всего хранить в массиве php, а не в базе данных. Вряд ли там больше нескольких сотен наберется.

AlikZP
На сайте с 22.11.2009
Offline
107
#8

Я бы сделал как предлагает FladeX если связь один к одному.

Или делать две таблицы, если связь один ко многим:

1. Таблицу категорий - id категории ( Primary ), Имя категории, другие ваши поля

2. Таблицу связей - id связи ( Primary ), id родителя, id категории

В обеих вариантах уровень вложенности неограничен

Website CMS: быстрая, удобная, недорогая! Вечная лицензия за 45$ (/ru/forum/524503) Яся - быстрый поиск фото для товаров. OpenCart/ocStore. Дополнение. (/ru/forum/665287) Грамотная верстка ваших макетов (/ru/forum/comment/8853216)
[Удален]
#9

лучше всего реализовать это через деревья аля nested sets

K
На сайте с 06.07.2009
Offline
11
#10

2 таблицы

1-я таблица категорий и подкатегорий

2-я таблица связей

Вторая таблица нужна если у вас возможно вложенность одной конкретной подкатегории в несколько категорий одновременно.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий