Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Отношение один ко многим....
 
 автор: hammet   (28.04.2007 в 15:00)   письмо автору
 
 

Здравствуйте! Помогите решить следующую задачу.
У меня есть таблица с товарами. Каждый товар может иметь множество сфер применения
(напр. металлургия, медицина, строительство и пр.). Есть вторая таблица с перечнем сфер применения товаров, вида

id  |  name
-------------
1      медицина
2      промышленность
3      хозяйство
---------------------

Пользователь имеет возможность редактировать список сфер применения, а также "привязывать" товар к одной или нескольким сферам.

У меня загвоздка в том как реализовать динамическую связь? Ведь число сфер применения может меняться и создавать в табл. с товарами n-е количество полей нельзя.
Я пока нашел единственный выход -- записывать в таблицу с товарами несколько строк с разными
id сферы применения.

Например добавляем товар "Редуктор" котрый применяется в промышленности и строительстве и
заносим в таблицу с товарами 2 строки которые отличаются полем сферы применения.

Но ведь это не рациональное использование ресурса БД??? о_О

   
 
 автор: MIchail1982   (28.04.2007 в 15:36)   письмо автору
 
   для: hammet   (28.04.2007 в 15:00)
 

А если сделать 3-ю таблицу для соответствий
Tovar_id | Sfera_Id
и пусть пользователь редачит её
а для вывода сделать представление
Вот и получится динамическая таблица

   
 
 автор: hammet   (28.04.2007 в 15:56)   письмо автору
 
   для: MIchail1982   (28.04.2007 в 15:36)
 

А смысл? Как это облегчит задачу? все равно придется заносить несколько строк
item_id - branche_id_1
item_id - branche_id_2
item_id - branche_id_3
.....
Ведь так?
+ придется связывать эти таблицы хитро.....

   
 
 автор: MIchail1982   (28.04.2007 в 16:04)   письмо автору
653 байт
 
   для: hammet   (28.04.2007 в 15:56)
 

а для вывода сделать представление
при этом таблицы сами хитро свяжутся
Структура в аттаче

   
 
 автор: hammet   (28.04.2007 в 16:10)   письмо автору
 
   для: MIchail1982   (28.04.2007 в 16:04)
 

Хорошо! Допустим у нас есть 3 таблицы: товары, сферы применения, и вспомогательная item_id | branche_id


Товары:

item_id  |  item_name | branche
===========================
    1            велосипеды   (тут 10 сфер применения)


как и вписывать? в одно поле через запятую?? о_О
не вариант....
может я Вас не понял, поясните

   
 
 автор: MIchail1982   (28.04.2007 в 16:16)   письмо автору
 
   для: hammet   (28.04.2007 в 16:10)
 

В аттач глянь

   
 
 автор: Trianon   (28.04.2007 в 16:21)   письмо автору
 
   для: MIchail1982   (28.04.2007 в 16:16)
 

Первичный ключ к таблице связки всё же стоило бы добавить. Да и индексы расставить не помешало бы.

to hammet :
Эта связь - многие ко многим.
Разные товары к разным сферам.

   
 
 автор: hammet   (28.04.2007 в 16:51)   письмо автору
 
   для: Trianon   (28.04.2007 в 16:21)
 


DROP DATABASE IF EXISTS `qwerty`;
CREATE DATABASE `qwerty` /*!40100 DEFAULT CHARACTER SET cp1251 */;
USE `qwerty`;
CREATE TABLE `Sfera` (
  `Id` int(11) NOT NULL auto_increment,
  `Name` tinytext NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `Sootv` (
  `Tovar` int(11) default NULL,
  `Sfera` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `Tovar` (
  `Id` int(11) NOT NULL auto_increment,
  `Name` tinytext NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `newview` AS select `tovar`.`Name` AS `Tovar`,`sfera`.`Name` AS `Sfera` from ((`tovar` join `sfera`) join `sootv`) where ((`sootv`.`Tovar` = `tovar`.`Id`) and (`sootv`.`Sfera` = `sfera`.`Id`));


Это агрегат? Я так и не понял как производить запись в таком случае??Я добавляю товар :
имя = велосипед
сфера = сфера1, сфера2, сфера3

Как мне записать в БД такие данные при этой конструкции?

   
 
 автор: MIchail1982   (28.04.2007 в 17:07)   письмо автору
 
   для: hammet   (28.04.2007 в 16:51)
 


Insert into tovar (Name)   VALUES (велосипед);
Insert into Sootv (Tovar,Sfera)   VALUES (1,1);
Insert into Sootv (Tovar,Sfera)   VALUES (1,2);
Insert into Sootv (Tovar,Sfera)   VALUES (1,3);

если велосипед имеет id=1

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования