Архитектура проекта

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Архитектура проекта

Сообщение Антон »

Делаю интернет магазин. Подскажите как вы храните свойства товара, нужно хранить примерно так
Изображение
И как организовать поиск по этим параметрам
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Архитектура проекта

Сообщение SiZE »

Может стоить отталкиваться от опыта предков? Установи opencart и посмотри, как там сделано. Разберешься за 5 минут.
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: Архитектура проекта

Сообщение Антон »

Спасибо посмотрю.
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: Архитектура проекта

Сообщение Антон »

Посмотрел там как раз этого и нету
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: Архитектура проекта

Сообщение Антон »

Да полезная статья, но не описано как создавать группы.
Например
звук(тип-стерео,сила-15дб) и т.д.
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Архитектура проекта

Сообщение sluchainiyznak »

Оно и понятно, это ведь просто пример.
Для объединения атрибутов в группы нужно "сваять" связь многие-ко-многим между таблицей атрибутов и таблицей групп
Аватара пользователя
GeX
Сообщения: 52
Зарегистрирован: 2013.01.22, 09:10

Re: Архитектура проекта

Сообщение GeX »

EAV не самое лучшее решение в плане скорости ИМХО. Типичная задача: есть 10 000 теликов, нужно вывести 300 теликов посортировав их сначала по диагонали, а потом по цене, вывести нужно таблицей с полной инфой о телике, то есть все поля. Я, например, не знаю как эту проблему без вложенных запросов решить если диагональ и цена висят в EAV-таблице... Все 10 000 выгребать и с ними оперировать не вариант :(

UPD: сообразил, есть способ через join линковать одну и ту же таблицу под разными alias, а в where цеплять условие по какому атрибуту конкретно с этого alias выгребать... но это ж медленно до чертиков... или нет?
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Архитектура проекта

Сообщение solo »

GeX писал(а):EAV не самое лучшее решение в плане скорости ИМХО. Типичная задача: есть 10 000 теликов, нужно вывести 300 теликов посортировав их сначала по диагонали, а потом по цене, вывести нужно таблицей с полной инфой о телике, то есть все поля. Я, например, не знаю как эту проблему без вложенных запросов решить если диагональ и цена висят в EAV-таблице... Все 10 000 выгребать и с ними оперировать не вариант :(
Если нужна скорость можешь сделать примочку которая будет строить таблицу с индексами по тем полям которые нужны и на ее основе отображать витрину с сортировками.
GeX писал(а):UPD: сообразил, есть способ через join линковать одну и ту же таблицу под разными alias, а в where цеплять условие по какому атрибуту конкретно с этого alias выгребать... но это ж медленно до чертиков... или нет?
Что то невероятно глупое. Наваяй пример если можешь.
Аватара пользователя
GeX
Сообщения: 52
Зарегистрирован: 2013.01.22, 09:10

Re: Архитектура проекта

Сообщение GeX »

Если нужна скорость можешь сделать примочку которая будет строить таблицу с индексами по тем полям которые нужны и на ее основе отображать витрину с сортировками.
А почему сразу не работать с такой таблицей? Всё равно придётся её строить, всё равно как-то выкручиваться когда товар будет разношерстным (или делать несколько таблиц каждую под свой товар, или в одну слить все уникальные колонки. разница? зачем делать двойную работу?).
Что то невероятно глупое. Наваяй пример если можешь.

Код: Выделить всё

CREATE TABLE `param` (
  `id` int(11) NOT NULL DEFAULT '0',
  `attr` varchar(255) NOT NULL DEFAULT '',
  `val` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`,`attr`),
  CONSTRAINT `param_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tv` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `param` VALUES ('1', 'diag', '32');
INSERT INTO `param` VALUES ('1', 'type', 'led');
INSERT INTO `param` VALUES ('2', 'diag', '21');
INSERT INTO `param` VALUES ('2', 'type', 'crt');
INSERT INTO `param` VALUES ('3', 'diag', '42');

CREATE TABLE `tv` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


INSERT INTO `tv` VALUES ('1', 'Gnusmas');
INSERT INTO `tv` VALUES ('2', 'Shibato');
INSERT INTO `tv` VALUES ('3', 'Hrundik');

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

SELECT
tv.id,
tv.`name`,
diag_table.val AS diag,
type_table.val AS type
FROM
tv
LEFT JOIN param AS diag_table ON tv.id = diag_table.id AND diag_table.attr = 'diag'
LEFT JOIN param AS type_table ON tv.id = type_table.id AND type_table.attr = 'type'

Как-то так, сорри, пример накидан за пару минут. Условие лучше в join, если будет валяться в where будут выпадать строки.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Архитектура проекта

Сообщение solo »

Конечно лучше делать сразу (и под группу товаров отдельную таблицу).
Ответить