Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > посоветуйте структуру БД каталога продукции


Автор: slang 25.1.2008, 17:51
Надо сделать простенькую базу для хранения каталога продукции. При этом исходя из принципа "все гениальное просто"  smile подумал что вполне можно сделать базу так:
id – код продукции или группы продукции (счетчик)
id_group – id группы в которую входит эта группа или продукция (число)
name – наименование продукции или группы продукции (текст до 200 символов)
pic – имя файла с изображением (текст до 100 символов)
comment – описание продукции (текст до 65000 символов)

но вот подумал, а если продукция будет относиться к нескольким группам, то каким образом изменить поле id_group?

Автор: GeneralElectric 25.1.2008, 18:44
тут должно было быть две таблицы.
Одна - каталог, а вторая - продукция.

Автор: slang 25.1.2008, 18:54
GeneralElectric, это я понимаю smile, но хочется выпендриться и сделать в одной, а собственно почему и нет?
Предположим речь идет не о продукции, а о чем-то другом... Например, возьмем кабинет... smile, есть кабинет, как корень (первая группа), в кабинете есть элементы: стол, стул, диван, компьютер. Вроде все нормально smile, но стол также является группой, так как к столу относятся: столешница, ножки, винты (еще что-то). Отсюда, мне необходимо заводить в таблице с категориями группу стол, а зачем мне заниматься дублированием?

Если только сделать так:
Таблица номенклатура:
id – код продукции или группы продукции (счетчик)
name – наименование продукции или группы продукции (текст до 200 символов)
pic – имя файла с изображением (текст до 100 символов)
comment – описание продукции (текст до 65000 символов)

Таблица группировки:
id - счетчик
id_prod - id продукции (группы) (число)
id_group - id продукции (группы) к которой относится эта продукция

Добавлено через 43 секунды
есть у кого идеи лучше?

Автор: bars80080 25.1.2008, 19:06
если у тебя идёт дальнейшее ветвление, да ещё с участием пунктов в разных ветках, то лучше сделать в две таблицы
просто некоторые пункты каталога (содержание которых - иерархия и id элемента) будут обращаться на один и тот же пункт (содержание - большой объём данных)

Автор: vasac 25.1.2008, 19:11
Вы определитесь сначала, вам дерево нужно или "продукция может относиться к нескольким группам".
Если дерево, какие проблемы? id, parent_id.
Если к нескольким группам — нужна отдельная таблица соответствий объект-предок.

Автор: slang 25.1.2008, 19:25
vasac, а разве одно исключает другое?!
Примерно так... не пойдет?
Код

CREATE TABLE `katalog` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`pic` VARCHAR( 50 ) NOT NULL ,
`comment` LONGTEXT NOT NULL 
) ENGINE = innodb COMMENT = 'элементы или группы элементов';

CREATE TABLE `katalog_group` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`id_element` INT NOT NULL ,
`id_group` INT NOT NULL 
) ENGINE = innodb COMMENT = 'таблица соответствия элементов и групп';


id_group и id_element связаны с id из таблицы katalog

Автор: GeneralElectric 25.1.2008, 19:47
Где у тебя связь между ними? тут ещё третья нужна
А в остальном - думаю, ты сам придешь к тому, чтобы не смешивать разделы каталога и его содержимое. Но заставить тебя, разумеется, невозможно. Не хочешь учиться на чужих ошибках - учись на своих.

Автор: slang 25.1.2008, 19:58
GeneralElectric, ты часто прописываешь связи в MySQL базе? я всегда это делаю в скрипте.
Т.е. такая база является не корректной?
Код

CREATE TABLE `katalog` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  `pic` varchar(50) NOT NULL,
  `comment` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 COMMENT='элементы или группы элементов' AUTO_INCREMENT=5 ;

INSERT INTO `katalog` (`id`, `name`, `pic`, `comment`) VALUES (1, 'Первый элемент', '', ''),
(2, 'Второй элемент', '', ''),
(3, 'Третий элемент', '', ''),
(4, 'Четвертый элемент', '', '');

-- --------------------------------------------------------

CREATE TABLE `katalog_group` (
  `id` int(11) NOT NULL auto_increment,
  `id_element` int(11) NOT NULL,
  `id_group` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 COMMENT='таблица соответствия элементов' AUTO_INCREMENT=5 ;

INSERT INTO `katalog_group` (`id`, `id_element`, `id_group`) VALUES (1, 2, 1),
(2, 3, 1),
(3, 4, 2),
(4, 4, 3);


здесь Первый элемент - корень (группа, но не обязательно). В него входят второй и третий элементы, а также они являются группой для четвертого элемента, который входит как во второй, так и в третий элемент.

Автор: GeneralElectric 25.1.2008, 20:21
Не понял. Что значит - прописывать связи в скрипте?

Таблицу я твою не понял. Может, я совсем тупой, а такое решение слишком прогрессивное, но реализацию в одной и той же таблице и дерева, и связи один-ко-многим - я не могу.

Постой. У тебя там дерева вобще, что ли, нету? Срабатывает стереотип мышления - еслим каталог, то дерево. понятно.
Тогда id во второй таблице - лишнее поле, а в остальном - классическая схема.

Автор: slang 25.1.2008, 20:22
Цитата(GeneralElectric @  25.1.2008,  20:21 Найти цитируемый пост)
Тогда id во второй таблице - лишнее поле, а в остальном - классическая схема.

ну это я по привычке smile, любую таблицу начинаю с id

Автор: GeneralElectric 25.1.2008, 20:37
Нет, я снова туплю. Дерево, конечно же, есть. Единица является папой двойки, а двойка - четверки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)