Архитектурный вопрос ( произвольное доп. полей к записи )

Agatov

Новичок
Архитектурный вопрос ( произвольное кол-во доп. полей к записи )

Разрабатываю каталог объявлений. Клиент хочет, чтобы к объяве в конкретной категории можно было помимо стандартных полей ("заголовок", "тип предложения", "цена" и.т.п.) пришить ещё произвольное количество полей, списков, чекбоксов и.т.п. Потом эти данные будут выводится при просмотре объявления.

сразу напросилось такое решение - сделать дополнительную таблицу вида "id/category_id/field_type/". и таблицу со значениями "id/category_id/id объявления/field_id/значение".

Теперь предположим, что дополнительных полей у нас так штук по 5-20 в зависимости от категории. Получается что при вставке/обновлении значений в бд это ещё + 5-20 запросов. Тематика сайта, правда, такова, что вставок будет не так уж и много и на это дело можно, скрестив пальцы, закрыть глаза. Но что, если потом клиенту понадобится организовать поиск по этим "доп" полям или выводить их в общей таблице с объявлениями?

Вобщем вопрос сообществу форума - допустим ли такой подход, или же лучше поискать другой? Какие ещё варианты решения существуют?
 

HraKK

Мудак
Команда форума
PHP:
-- phpMyAdmin SQL Dump
-- version 2.8.1
-- http://www.phpmyadmin.net
-- 
-- Хост: localhost
-- Время создания: Фев 11 2009 г., 23:43
-- Версия сервера: 4.1.16
-- Версия PHP: 5.2.5
-- 
-- БД: `lbook`
-- 

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

-- 
-- Структура таблицы `xx_product_param`
-- 

CREATE TABLE `xx_product_param` (
  `id` int(11) NOT NULL auto_increment,
  `alias` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

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

-- 
-- Структура таблицы `xx_product_param_description`
-- 

CREATE TABLE `xx_product_param_description` (
  `idParam` int(11) NOT NULL default '0',
  `idLanguage` int(11) NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  KEY `fk_xx_product_param_desc_xx_language` (`idLanguage`),
  KEY `fk_xx_product_param_desc_xx_product_param` (`idParam`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

-- 
-- Структура таблицы `xx_product_param_to_category`
-- 

CREATE TABLE `xx_product_param_to_category` (
  `idCategory` int(11) NOT NULL default '0',
  `idParam` int(11) NOT NULL default '0',
  `position` int(11) NOT NULL default '0',
  KEY `fk_xx_product_param_to_category_xx_product_categories` (`idCategory`),
  KEY `fk_xx_product_param_to_category_xx_product_param` (`idParam`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

-- 
-- Структура таблицы `xx_product_param_value`
-- 

CREATE TABLE `xx_product_param_value` (
  `id` int(11) NOT NULL auto_increment,
  `idParam` int(11) NOT NULL default '0',
  `idLanguage` int(11) NOT NULL default '0',
  `value` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `fk_xx_product_param_value_xx_language` (`idParam`),
  KEY `fk_xx_product_param_value_xx_product_param` (`idParam`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=132 ;

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

-- 
-- Структура таблицы `xx_product_param_value_to_product`
-- 

CREATE TABLE `xx_product_param_value_to_product` (
  `idParam` int(10) unsigned NOT NULL default '0',
  `idValue` int(11) NOT NULL default '0',
  `idProduct` int(11) NOT NULL default '0',
  `idLanguage` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`idParam`,`idProduct`,`idLanguage`),
  KEY `fk_xx_product_param_value_to_product_xx_product_param_value` (`idValue`),
  KEY `fk_xx_product_param_value_to_product_xx_product` (`idProduct`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-~{}~ 11.02.09 23:54:

Только добавь тип поля если надо еще.
 

Активист

Активист
Команда форума
zerkms
когда я смотрю на обилие ключей при разработке приложений у себя в проекте, тоже смеюсь)))
 

Активист

Активист
Команда форума
zerkms
У программиста - мускуле_ключе_мания или тормозо_фобия )))

HraKK
Мама, мама! Это не я! Это все Петя с соседнего двора!!

-~{}~ 12.02.09 02:36:

zerkms
Вообще, названия ключа похоже на TODO, типа, когда будет паблишь проекта - не забудь поменять структуру ключей бд.
 

zerkms

TDD infected
Команда форума
Активист
я делал акцент не на длину названий ключей, а на то, что созданы 2 индекса на одно и то же поле.
 

HEm

Сетевой бобер
fixxxer
как в том анекдоте/ералаше ("А на этот случай, тетенька, проездной имеется!")
 
Сверху