Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Структура таблиц фильтра по странам для показа связки компания-продукт / 1 сообщений из 1, страница 1 из 1
15.07.2015, 14:48:59
    #39007929
Arm_45
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура таблиц фильтра по странам для показа связки компания-продукт
Здравствуйте.
Подскажите кто сталкивался.

Необходимо спроектировать фильтрацию показа продуктов/компаний по странам.
Показывать компанию и/или продукт только для посетителей из выбранных в фильтре стран.
Или показывать всем, если записей нет.

Т.е. если в фильтре есть запись о компании или продукте компании, то надо показывать эту сущность только в той стране(странах), которая указана в фильтре. Если записей нет, то показывать везде. (ниже поясню подробнее)

Исходные данные:
Сайт-каталог показывает продукцию компаний.

страница списки компаний, страница списки продуктов, страница компании, страница продукта.

Есть таблица компании (companies id, name, ....)
Есть таблица продуктов компаний (products - поле id,company_id, .... )
Есть страны (countries id, iso, name,...)

Продуктов планируется около 100 000, компаний около 10 000, страны - (это понятно) около 300.


Пример:
Если компания (пускай будет Test_CORP ) есть в фильтре (например: только для Гондураса геокод id=340) - то ссылку на страницу этой компании и ссылки на страницы продуктов этой компании надо показывать только для посетителей сайта из Гондураса.

Если есть только продукт (TEST_PRODUCT) этой компании в фильтре (усложним: только для Гондураса или Никарагуа) - то ссылку на страницу компании Test_CORP и другие продукты этой компании показывать всем, а ссылку на продукт TEST_PRODUCT показывать только для посетителей из Гондураса или из Никарагуа.


Я додумался до двух вариантов таблицы фильтра:
1 Вариант - одна таблица
Код: sql
1.
only_in_country:  item_id, item_type, country_id 



item_id: это product_id или company_id в зависимости от item_type
item_type: 1- продукт, 2 - компания

Сюда впихивается и компания и продукт и делается SQL:
с 2-мя LEFT JOIN (один для продуктов, один для компаний), если надо показать продукт
с 1 LEFT JOIN (только для компаний), если показать компанию

Например:
*
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT *
FROM products as p
LEFT JOIN only_in_country as oic1 ON oic1.item_type=1 AND oic1.item_id = p.id,
LEFT JOIN only_in_country as oic2 ON oic2.item_type=2 AND oic2.item_id = p.company_id
WHERE 
....
AND
(
oic1.item_id IS NULL
OR
oic1.country_id = 340
OR
oic2.item_id IS NULL
OR
oic2.country_id = 340
)


* тут я не уверен, что правильно будет выбирать (хотя всегда можно заколхозить GROUP BY :) )


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT *
FROM companies as c
LEFT JOIN only_in_country as oic2 ON oic2.item_type=2 AND oic2.item_id = c.company_id
WHERE 
....
AND
(
oic2.item_id IS NULL
OR
oic2.country_id = 340
)



2 Вариант: 2 таблицы:
Код: sql
1.
products_only_in_country (product_id, country_id) 


Код: sql
1.
companies_only_in_country (company_id, country_id)



Тоже по LEFT JOIN для обоих таблиц, если показать продукт.
Или 1 LEFT JOIN для таблицы компаний, если показать компанию.

Например:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT *
FROM products as p
LEFT JOIN products_only_in_country as poic ON poic.product_id = p.id,
LEFT JOIN companies_only_in_country as coic ON coic.company_id = p.company_id
WHERE 
....
AND
(
poic.product_id IS NULL
OR
poic.country_id = 340
OR
coic.company_id IS NULL
OR
coic.country_id = 340
)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT *
FROM companies as c
LEFT JOIN companies_only_in_country as coic ON coic.company_id = c.company_id
WHERE 
....
AND
(
coic.company_id IS NULL
OR
coic.country_id = 340
)



И соответственно всю эту логику надо будет реализовать в SQL запросах.
Я примерно представляю как это сделать, но не могу оценить масштабы трагедии по 2-м вариантам (читай сложности в составлении SQL запросов).
Для компаний более-менее ясно как выбирать логику.
А для продукта надо смотреть, чтобы не только продукта не было в фильтре, но и компании, которой принадлежит продукт тоже не было в фильтре.

Плюс к этому если будет 2 таблицы фильтра, то тогда можно будет добавить для products_only_in_country внешние индекс для продукта (UPDATE, DELETE CASCADE)

Может кто уже сталкивался с такой задачей и подскажет: какой вариант лучше по скорости выполнения и мороки?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Структура таблиц фильтра по странам для показа связки компания-продукт / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]