Нужна помощь в организации структуры БД

fcms

Новичок
Нужна помощь в организации структуры БД

Необходимо реализовать структуру БД для следующего решения:
Есть набор сайтов, на которых размещаются галереи изображений, существует единое хранилище, где хранятся все галереи. Для галерей назначаются категории (множественный выбор), к которым относится галерея и для каждого сайта назначаются условия, например сайт должен содержать галереи с категория1 и категория2 или категория3.
Необходима быстрая выборка по БД с условиями:
Получить список галерей для сайта1 (для сайта1 задано условие категория1 и категория2 или категория3).
Два возможных решения это задачи, которые придумал:
1. делаем таблицу галерей, таблицу категорий и еще одну таблицу для связи много ко многим, где производим связку галерей и категорий. Минус этого решения для приведенного выше условия – делать объединяющий запрос для двух запросов, в которых выбирать галереи для категории 3 и выбирать галереи для категории 1 и категории 2 (для того чтобы найти галереи с условием «и» необходимо дважды таблицу – связку использовать в запросе, при большом количестве условий «и» для каждого из условий необходимо выделять alias, что возможно повлечет большую нагрузку на mysql)
2. делаем таблицу галерей и таблицу категорий где одна категория – одно поле типа Boolean. При добавлении пользователем категорий делать alter table таблицы с категориями и добавлять поле. В этом случае опять же делать объеденяющий запрос на два запроса, но запросы будут более простыми select ftom категории where category3=true и select from категории where category1=true and category2=true. Для данного решения минус – количество категорий ограничено максимальным количеством полей таблицы mysql.
Возможно есть еще какие-то решения, которых я не нашел?
И какое из решений будет более оптимальным и «скорострельным» (количество категорий и условий для сайтов заранее не известно)?
 

Panchous

Павел
вопрос не об "оптимальности" и "скорости", а о ПРАВИЛЬНОМ РЕШЕНИИ.
№2 - просто безграмотно!

Таблицы:
1. сайты
2. категории
3. галереи
4. сайты2категории
5. галереи2категории

-~{}~ 14.10.05 15:26:

кстати, ты еще и форумом ошибся...
 

fcms

Новичок
Ага, это правильно, но теперь посмотри как будут выбираться данные например если надо выбрать все галлереи, которые включены в категорию1, категорию2, категорию3, категорию4, категорию5, категорию6, категорию7, категорию8, категорию9, категорию10, т.е. в условии 10 категорий...
чтобы выявить что галлерея входит во ВСЕ категории, будет запрос типа
select * from галереи, категории as cat1, категории as cat2, категории as cat3,... категории as cat10 where галлерея.категория=cat1.id and галлерея.категория=cat2.id and ... галлерея.категория=cat10.id and
cat1.id=value and cat2.id=value and cat3.id=value and .... cat10.id=value

А теперь насколько я понимаю посмотрим как будет работать mysql. для каждой из записи галлереи будет создано очень много записей со всеми вариантами категорий, в данном случае если разных категорий например у нас 30 и выборка по 10 категориям сразу, то 10 в 30 степени записей, из которых потом будет сделана выборка нужных записей. даже если все сработает по индексам, то по-моему при возрастающем количестве значений категорий и условий для выборки времени будет тратиться все больше и больше...

Разве не так?
Я не спорю что это ПРАВИЛЬНОЕ решение, но иногда все-же нужно отходить от правил нормализаций в сторону скорости и оптимальности.

Поправьте если что не так сказал
 

Panchous

Павел
чтобы выявить что галлерея входит во ВСЕ категории, будет запрос типа
select * from галереи, категории as cat1, категории as cat2, категории as cat3,... категории as cat10 where галлерея.категория=cat1.id and галлерея.категория=cat2.id and ... галлерея.категория=cat10.id and
cat1.id=value and cat2.id=value and cat3.id=value and .... cat10.id=value
белеберда какая-то...
 

fcms

Новичок
почему белеберда?
результирующий запрос должен вернуть все галереи, для которых заданы ВСЕ категории,
таблица содержит номер галереи и номер категории, для одной галереи все назначенные категории содержатся не в одной записи, написать что-то типа select id from gallery_categories where category=1 and category=2 мыне можем, это бред.

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

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

fcms

Новичок
как ты написал выше, есть таблицы
Таблицы:
1. сайты
2. категории
3. галереи
4. сайты2категории
5. галереи2категории

мне необходимо получить все галереи, для которых задана принадлежность к категории1, категории2, .... категории10

как я могу получить все эти галереи из такой структуры?
 

Panchous

Павел
SELECT * FROM галереи, галереи2категории
WHERE галереи.id=галереи2категории.id_галереи
AND галереи2категории.id_категории IN(1,2,..)
 

fcms

Новичок
если есть такие галереи:
1 - кат1, кат2, кат3
2- кат2, кат4, кат3
3- кат1, кат3

и ты сделаешь запрос указанный выше (нужно получит все галереи, для которых есть кат2 и кат3)
ты напришешь in (cat2, cat3)
и тебе вернутся все 3 галлереи а не 1 и 2
потому что in проверит одно из двух значений и если одно из них присутствует, вернет результат (логическое ИЛИ), а необходимо чтобы только при наличии обоих категорий галерея попала в результат (логическое И)
 

Panchous

Павел
SELECT * FROM галереи
LEFT JOIN галереи2категории ON (галереи.id=галереи2категории.id_галереи AND галереи2категории.id_категории=1)
LEFT JOIN галереи2категории ON (галереи.id=галереи2категории.id_галереи AND галереи2категории.id_категории=2)
....
?
 

fcms

Новичок
да, по сути это и будет 10 альясов
если 10 выражений, категорий допустим всего 30 уникальных, 10 в 30 степени записей если ты уберешь условия типа галереи2категории.id_категории=1, это не будет тормозить ты считаешь?
 

Panchous

Павел
не буду отвечать, т.к. не знаю точно
может кто подскажет...

но уверен в том, что организовывать структуру лучше ПРАВИЛЬНО - тогда при любой возникшей задаче можно будет решение найти. а так - неизвестно, чем в итоге обернется...
 

fcms

Новичок
иногда ПРАВИЛЬНАЯ структура может неизвестно чем обернуться, поэтому и спрашивал что оптимальнее...
 

MuXa247

Новичок
[SQL]SELECT галереи2категории.id_галереи, count(*) cnt FROM галереи2категории
WHERE галереи2категории.id IN(1,2)
GROUP BY галереи2категории.id_галереи HAVING сnt = 2
[/SQL]
где,
IN(1,2) - категории в которых находится текущая галерея
cnt = 2 - количество категорий в которых находится текущая галерея

Такое решение пойдет? Галереи сам привязывай... :)
 
Сверху