MySQL набор хранения - PullRequest
       20

MySQL набор хранения

1 голос
/ 08 апреля 2009

У меня есть пара таблиц в веб-приложении, которое я пишу на PHP, и я хотел бы знать, будет ли это хорошей практикой.

CREATE TABLE `products`(
  `product_id` int NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `variations` varchar(255) default NULL,
  PRIMARY KEY  (`product_id`)
)

CREATE TABLE `variations`(
  `variation_id` int NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `kind` varchar(255) default NULL,
  PRIMARY KEY  (`variation_id`)
)

Например, продукт будет:

1,'Cup','1,2,3'

В то время как вариант будет:

1,'Green','Color'
2,'Glass','Texture'
3,'Blue','Color'

такой, что многие продукты могут иметь одинаковые цвета / текстуры. Проблема, которую я нахожу, заключается в том, что я не могу вписать это в один запрос, который бы возвращал данные в виде:

1,'Cup','1,Green,Color-2,Glass,Texture-3,Blue,Color'

И затем, соответственно, проанализируйте это, чтобы отобразить изображение каждого варианта.

Является ли хранимая функция, которая возвращает этот формат, лучшей идеей? Или мне следует нормализоваться еще дальше, и если да, то как?

Ответы [ 2 ]

5 голосов
/ 08 апреля 2009

Я считаю, что разумнее всего добавить еще одну таблицу:

CREATE TABLE `products_variations`(
  `product_id` int NOT NULL,
  `variation_id` int NOT NULL,
  PRIMARY KEY  (`product_id`, `variation_id`)
);

Оттуда простой запрос, объединяющий три таблицы, даст вам необходимые результаты.

1 голос
/ 08 апреля 2009
SELECT  GROUP_CONCAT(variation_id, ', ', name, ', ', kind SEPARATOR '-')
FROM    products
INNER JOIN
        variations
ON      FIND_IN_SET(variation_id, variations)
GROUP BY
        product_id

Поскольку это отношение многих ко многим, лучше иметь третью таблицу:

CREATE TABLE product_variations
(
   product_id INT NOT NULL,
   variation_id INT NOT NULL,
   PRIMARY KEY (product_id, variation_id)
);
...