Универсальный каталог

profan

Новичок
ну вот немного измененная схема таблиц динамического каталога (может и не совсем корректная, скажите тогда где)

Goods - в таб. хранятся значения строк
-------------
- id
- int - значения типа int
- date - значения типа date
- text - значения типа text
- property prorerties.id - свойства (цена, кол-во..)
- line lines.id - идентификатор строка (записи)

Lines - строки (записи)
-------------
- id
- good goods.id - заначения кот. входят в строку
- user users.id - пользователь кот. принадлежит строка

Prorerties - свойства (цена, кол-во..)
--------------
- id
- name
- type types.id - тип свойства (цена - int, описание - text...)

Types- тип свойства (цена - int, описание - text...)
-------------
- id
- name

Users
---------
- id
- name

zerkms
не могли бы вы привести пример запроса для выбора целой строки с полем (int, dada, text) AS DATA. Т.е получить конкретное значение data в место набора (int, dada, text).
спасибо..

-~{}~ 23.03.08 18:10:

Lines - строки (записи)
-------------
- id
- user users.id - пользователь кот. принадлежит строка

в Lines не нужно good.id ))
 

Anky

Новичок
Поле нужное можно просто через CASE выбрать.

А вот с сортировкой и нормальным поиском по значению - проблема.
Никто не придумал как в горизонталь данные сложить?

Кто как вообще сортирует/фильрует по значению?
 

pilot911

Новичок
а нельзя хранить все данные (размер=>XXL и тп) для конкретного товара в одном поле BLOB в виде сериализованного массива ?

а для поискового индекса создавать отдельную таблицу
 

pilot911

Новичок
[sql]
CREATE TABLE `товар` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,

#статические данные

`название` ,
`категория` ,
`вес` ,
`цвет` ,
`размер` ,
`цена1` ,

`свойства` BLOB,

PRIMARY KEY (`id`),
);
[/sql]


Поле "свойства" имеет тип BLOB - здесь хранится сериализованный массив

PHP:
array('номер свойства 1/* таблица "свойство" */'=>'значение', 'номер свойства 2 /* таблица "свойство" */'=>'значение')

Таблица свойств:


PHP:
CREATE TABLE `свойство` (
  `id` 				int(6) 	unsigned 	NOT NULL AUTO_INCREMENT,
 	
  `название` 		BLOB, 
  `тип` 			ENUM(целое, дробное, текст, большой текст, чекбокс, ...),
  
  PRIMARY KEY  (`id`),
);

Поле "название" имеет тип BLOB для удобства мультиязычности - здесь хранится сериализованный массив

PHP:
array('ru'=>'Цвет', 'en'=>'Color')



[sql]
CREATE TABLE `товар-свойство` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,

`ID товар` ,
`ID свойство` ,

PRIMARY KEY (`id`),
);
[/sql]



Индексная таблица



[sql]
CREATE TABLE `товар-индекс` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,

`ID товар` ,
`ID свойство` ,
`значение` ,



PRIMARY KEY (`id`),
);
[/sql]
 

zerkms

TDD infected
Команда форума
и как найти что-то вроде "все товары, у которых диагональ > 50" ?
 

pilot911

Новичок
по таблице `товар-индекс` - мы же знаем ID свойства

находим ID товара, при этом можем связать таблицу `товар` для сортировки по цене или по количеству на складе
 

zerkms

TDD infected
Команда форума
pilot911
как мы будем делать выборку с > 50 по текстовому полю?
 

pilot911

Новичок
я привел упрощенную схему таблицы

в развернутом виде выглядит так


PHP:
CREATE TABLE `товар-индекс` (
`id` int( 6 ) unsigned NOT NULL AUTO_INCREMENT ,
`ID товар` ,
`ID свойство` ,
`поле INT значение или NULL`,
`поле FLOAT значение или NULL`,
`поле VARCHAR значение или NULL`,
`поле TEXT значение или NULL`,

PRIMARY KEY ( `id` ) ,
);

поля соответствуют по типу необходимым элементам из перечисления `тип` ENUM(целое, дробное, текст, большой текст, чекбокс, ...) таблицы "свойство"
 

zerkms

TDD infected
Команда форума
ну вот теперь да :)
как решение - принимается.
 

Andre

Новичок
Кстати, как вариант работает такой вариант поиска по динамическим полям: выбираем все объекты, для которых существуют характеристики, найденные по введенным условиям + если динамическая характеристика подразумевает несколько значений (чекбокс), то плюс наложение условий по количеству этих записей

вот пример реализации http://www.rbkland.ru/ , каждое поле и характеристика в форме справа динамическая + там поиск по диапазонам и конвертацией единиц измерения, если характеристика измеряемая
 

Andre

Новичок
SELECT a.* FROM main_advers AS a, main_shablons AS sh WHERE sh.id_subrazdel = 100 AND a.id_shablon = sh.id_shablon AND a.public = 1 AND (a.date_public = 0 OR a.date_public <= 1248675082) AND (a.date_close = 0 OR a.date_close >= 1248675082) AND EXISTS (SELECT COUNT(*) AS col FROM main_advers_chars_values WHERE id_adver = a.id AND id_char = 2 AND id_value IN (7) HAVING col >= 1) AND EXISTS (SELECT COUNT(*) AS col FROM main_advers_chars_values WHERE id_adver = a.id AND id_char = 4 AND id_value IN (11) HAVING col >= 1) AND EXISTS (SELECT * FROM main_advers_chars_values WHERE id_adver = a.id AND id_char = 6 AND IF (id_unit = 3, value, value * (SELECT reunit FROM main_advers_units WHERE id_reunit = main_advers_chars_values.id_unit AND id_unit = 3)) >= 100 AND IF (id_unit = 3, value, value * (SELECT reunit FROM main_advers_units WHERE id_reunit = main_advers_chars_values.id_unit AND id_unit = 3)) <= 1000) AND EXISTS (SELECT * FROM main_advers_chars_values WHERE id_adver = a.id AND id_char = 7) ORDER BY a.date_public LIMIT 10 OFFSET 0

-~{}~ 27.07.09 10:05:

пока так, можно оптимизировать если время будет и желание

-~{}~ 27.07.09 10:07:

выбираются объявления, привязанные к определенному шаблону (разделу) и имеющие заданные в поиске характеристики + пересчет единиц значений
 
Сверху