требуется совет по архитектуре при выборке материалов по тегам

F
На сайте с 24.04.2009
Offline
45
534

Значит есть задача выборки материалов по тегам (типам)

Есть типы

1. Тип: Звери, птицы, рептилии ...

2. Срок жизни: 5, 20,15, 20 лет ...

3. Цвет: зеленый, черный, белый ...

...

Например я указываю, что нужны

1. Вид: птицы, рептилии

2. Срок жизни 15, 20 лет

3. Цвет: зеленый, белый.

.....

Понятно что будут варианты

птицы, 15, белый

птицы, 15, зеленый

птицы, 20, белый

птицы, 20, зеленый

рептилии, 15, белый

рептилии, 15, зеленый

рептилии, 20, белый

рептилии, 20, зеленый

......

И вот тут возникает сама проблема.

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

в таблице вида

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

| id объекта | id типа |

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

| | |

То возникает проблема выборки id объектов которые удовлетворяют вариациям типа

птицы, 15, белый

птицы, 15, зеленый

птицы, 20, белый

птицы, 20, зеленый

рептилии, 15, белый

рептилии, 15, зеленый

рептилии, 20, белый

рептилии, 20, зеленый

Потому что непонятно как выбрать из данной таблицы id объектов, что удовлетворяют любой из вариаций приведенных выше.

Есть идея, сделать доп поле в таблице содержащей данные об объектах где будут хранится данные о типах в виде

id_птицы-id_15-id_белый

И тогда выборку объектов можно сделать одним запросом. Но есть проблема в том что могут быть варианты, где например объект может иметь два цвета или при формировании выборки цвет может быть любой и т.д.

Собственно, кто что может посоветовать по данному вопросу, может кто-то натолкнет на мысль, даст совет по оптимизации выборки и хранения связей.

М
На сайте с 08.02.2006
Offline
59
#1

Делайте связанную таблицу

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

| id объекта | id типа | Значение или Id значения

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

При выборке просто присоединяете ее к основной таблице JOINом

F
На сайте с 24.04.2009
Offline
45
#2
Магнат:
Делайте связанную таблицу
--------------------------------------------------
| id объекта | id типа | Значение или Id значения
--------------------------------------------------
При выборке просто присоединяете ее к основной таблице JOINом

Немного не так меня поняли.

Объекту присвоены теги (типы), к примеру: птицы, 15, 20, белый, зеленый

Для пользователя они группированы по неким общим критериям

Например

1. Вид

2. Срок жизни

3. Цвет

А дальше к примеру пользователь выбрал

1. Вид: птицы, рептилии

2. Срок жизни 15, 20 лет

3. Цвет: зеленый, белый.

Исходя из критериев я сформировал

птицы, 15, белый

птицы, 15, зеленый

птицы, 20, белый

птицы, 20, зеленый

рептилии, 15, белый

рептилии, 15, зеленый

рептилии, 20, белый

рептилии, 20, зеленый

А дальше возникает вопрос, в каком виде лучше хранить связи, объекты-теги, что бы можно было делать выборки по

птицы, 15, белый

птицы, 15, зеленый

птицы, 20, белый

птицы, 20, зеленый

рептилии, 15, белый

рептилии, 15, зеленый

рептилии, 20, белый

рептилии, 20, зеленый

Что было понятней, пример http://hotline.ua/gd/386/17133-17300-17159/, правда там электроника, но для примера самое то

Вот меня интересует выборка по тегам группированных по общим критериям как на примере.

Знаю что такое делается такое на Drupal + Taxonomy Filter, но меня не интересует готовое решение. Меня интересует алгоритм выборки. Так как мне проще дописать до своей ЦМС нужный функционал, чем осваивать Drupal и пересаживать потом весь сайт на него.

М
На сайте с 08.02.2006
Offline
59
#3

Эммм, что не так-то? У вас связь один ко многим, связываются такие типы связи через промежуточную таблицу.

Предложенная мной структура этой таблицы

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

| id объекта | id типа | Значение или Id значения

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

Полностью повторяет ваши данные

1 | вид | птицы

1 | срок жизни | 15

1 | цвет | белый

1 | цвет | зеленый

2 | вид | птицы

2 | срок жизни | 20

2 | цвет | белый

2 | цвет | зеленый

3 | вид | рептилии

3 | срок жизни | 15

3 | цвет | белый

3 | цвет | зеленый

и т.д....

F
На сайте с 24.04.2009
Offline
45
#4
Магнат:
Эммм, что не так-то? У вас связь один ко многим, связываются такие типы связи через промежуточную таблицу.

Предложенная мной структура этой таблицы
--------------------------------------------------
| id объекта | id типа | Значение или Id значения
--------------------------------------------------

Полностью повторяет ваши данные

1 | вид | птицы
1 | срок жизни | 15
1 | цвет | белый
1 | цвет | зеленый
2 | вид | птицы
2 | срок жизни | 20
2 | цвет | белый
2 | цвет | зеленый
3 | вид | рептилии
3 | срок жизни | 15
3 | цвет | белый
3 | цвет | зеленый

и т.д....

Хорошо

А как тогда выбирать id_обьекта, к примеру если пользователь выбрал

1. Вид: птицы, рептилии

2. Срок жизни 15, 20 лет

3. Цвет: зеленый, белый.

А дальше как из предложенной вами таблицы получить id_объектов удовлетворяющих одному из условий.

птицы, 15, белый

птицы, 15, зеленый

птицы, 20, белый

птицы, 20, зеленый

рептилии, 15, белый

рептилии, 15, зеленый

рептилии, 20, белый

рептилии, 20, зеленый

Есть идея

делать таблицу такого вида

id_объекта | вид | срок_жизни | цвет

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

1 | птицы | 15 | белый

1 | птицы | 15 | зеленый

2 | птицы | 20 | белый

3 | птицы | 20 | зеленый

4 | рептилии | 15 | белый

5 | рептилии | 15 | зеленый

6 | рептилии | 20 | белый

7 | рептилии | 20 | зеленый

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

SELECT id_объекта FROM table WHERE (вид='птицы' OR вид='рептилии' ) AND (срок_жизни='15' OR срок_жизни='20' ) AND (цвет='белый' OR вид='зеленый')

тогда выборка одним проходом, правда интересует не будет ли сильно медленной такая выборка при количестве записей порядка 10-100к

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий