Сущность с произвольным набором разнотипных свойств

nejtr0n

Гуру форума
Регистрация
24 Янв 2014
Сообщения
129
Реакции
82
Здравствуйте. Есть задача хранить товары с произвольным набором разных свойств (например, фаил, дата, число, гео данные). EAV для этого не очень подойдёт имхо.
Есть идея:
1) Таблица свойств - id, type_id, name
2) Таблица типов свойств - id, table_name, name
3) N-ое количество таблиц для каждого типа (Например - property_file, property_date)
4) Вид - который динамически делает group by на тип свойства, а затем джойнит нужные таблицы.
Но меня терзают смутные сомнения, что этот велосипед не взлетит ...
Может кто нибудь подскажет, как лучше организовать такие данные?
Заранее спасибо.
 
Тот же EAV только другая реализация. Такую штуку я видел на малоизвестном движке "dinamique" Для просмотра ссылки Войди или Зарегистрируйся, и все работало. Вот одна таблица
Код:
CREATE TABLE `wc_data_types` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) DEFAULT NULL,
  `key` varchar(40) DEFAULT NULL,
  `type_in_base` varchar(80) DEFAULT NULL,
  `as_has_many` tinyint(1) NOT NULL DEFAULT '0',
  `as_reference` tinyint(1) NOT NULL DEFAULT '0',
  `as_image` tinyint(1) NOT NULL DEFAULT '0',
  `as_file` tinyint(1) NOT NULL DEFAULT '0',
  `not_every_editable` tinyint(1) NOT NULL DEFAULT '0',
  `proccess_before_save` tinyint(1) NOT NULL DEFAULT '0',
  `proccess_before_delete` tinyint(1) NOT NULL DEFAULT '0',
  `data_processor` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `key` (`key`)
) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

--
-- Dumping data for table `wc_data_types`
--

INSERT INTO `wc_data_types` VALUES (1,'Text','text','VARCHAR(255)',0,0,0,0,0,0,0,NULL),(2,'Textarea','textarea','TEXT',0,0,0,0,0,0,0,NULL),(3,'Checkbox','checkbox','tinyint(1)',0,0,0,0,0,1,0,NULL),(4,'Select','select','int(11)',0,1,0,0,0,0,0,NULL),(5,'MultiSelect','multiSelect','VARCHAR(255)',1,1,0,0,0,0,0,NULL),(6,'Radio','radio','int(11)',0,1,0,0,0,0,0,NULL),(7,'Password','password','varchar(32)',0,0,0,0,1,1,0,NULL),(8,'File upload','file','varchar(40)',0,0,0,1,1,1,1,NULL),(9,'TextEditor','textEditor','LONGTEXT',0,0,0,0,0,0,0,NULL),(10,'Date','date','int(11)',0,0,0,0,0,1,0,NULL),(11,'Price','price','DOUBLE(15,2)',0,0,0,0,0,1,0,NULL),(12,'Document','document','int(11)',0,1,0,0,0,0,0,NULL),(13,'Embeded document','embeded_document','int(11)',0,1,0,0,0,1,1,NULL),(14,'Smart select','smart_select','int(11)',0,1,0,0,0,0,0,NULL),(15,'Int','digit','int(11)',0,0,0,0,0,0,0,NULL),(16,'Float','float','FLOAT(15,2)',0,0,0,0,0,0,0,NULL),(17,'Datetime','datetime','DATETIME',0,0,0,0,0,1,0,NULL),(18,'Select (REF)','select_ref','VARCHAR(255)',1,1,0,0,0,0,0,NULL),(19,'MultiSelect (REF)','multiSelect_ref','VARCHAR(255)',1,1,0,0,0,0,0,NULL),(20,'Currency','currency','int(11)',0,1,0,0,0,0,0,NULL);
 
пункт 3 ужасен.
не надо плодить таблицы.
всё храни в одной. ну точнее в двух: в одной описания типов полей, во второй значение всех типов полей всех товаров.

выборки потом делаешь легко таким способом:

SELECT

{fields}

FROM

Goods as c

LEFT JOIN CustomFields as cfJob
ON c.id = cfJob.goodsId and cfJob.id='848126'

LEFT JOIN CustomFields as cfPR
ON c.id = cfPR.goodsId and cfPR.id='914862'

WHERE {where}
 
Назад
Сверху