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

Тема в разделе "Базы данных", создана пользователем nejtr0n, 24 июл 2015.

Модераторы: latteo
  1. nejtr0n

    nejtr0n Постоялец

    Регистр.:
    24 янв 2014
    Сообщения:
    127
    Симпатии:
    69
    Здравствуйте. Есть задача хранить товары с произвольным набором разных свойств (например, фаил, дата, число, гео данные). EAV для этого не очень подойдёт имхо.
    Есть идея:
    1) Таблица свойств - id, type_id, name
    2) Таблица типов свойств - id, table_name, name
    3) N-ое количество таблиц для каждого типа (Например - property_file, property_date)
    4) Вид - который динамически делает group by на тип свойства, а затем джойнит нужные таблицы.
    Но меня терзают смутные сомнения, что этот велосипед не взлетит ...
    Может кто нибудь подскажет, как лучше организовать такие данные?
    Заранее спасибо.
     
  2. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    127
    Симпатии:
    85
    Тот же EAV только другая реализация. Такую штуку я видел на малоизвестном движке "dinamique" http://dinamique.com/, и все работало. Вот одна таблица
    Код:
    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. bibika

    bibika Создатель

    Регистр.:
    30 янв 2016
    Сообщения:
    7
    Симпатии:
    1
    пункт 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}