Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите со структурой БД / 6 сообщений из 6, страница 1 из 1
22.11.2014, 17:46:14
    #38814133
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
Планирую структуру БД для каталога товаров со множеством свойств. В перспективе нужна быстрая фильтрация по данным свойствам.
Придумалась следующая схема:

Связующая таблица connect:
product_id type_id type_value354117354420
product_id - айдишник товара
type_id - айди свойства
type_value - значение свойства

Сами свойства хранить тоже в классическом нормализованном стиле. Например:

Табличка #1 weight значений массы:
idvalue1 3... ...17 100

Табличка #2 length значений длины:
idvalue1 5... ...20 42

То есть товар из самой верхней таблицы обладает свойством масса 100 и длинной 42.

Тогда запрос на вывод товаров по критериям будет выглядеть примерно так:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM products 
LEFT JOIN `connect` ON `products`.id = `connect`.product_id
LEFT JOIN `weight` ON `weight`.id = `connect`.value_id AND `connect`.type_id = 1
LEFT JOIN `length` ON `length` .id = `connect`.value_id AND `connect`.type_id = 2
....



Нутром чую, что производительность такого решения будет мягко говоря "неочень"даже с индексами :)
Может есть какое-то более оптимальное решение?
...
Рейтинг: 0 / 0
22.11.2014, 17:56:34
    #38814139
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
sharmanka,

поздравляю, вы изобрели велосипедEAV :)
альтернатива - сделать одну таблицу, где свойства будут в столбцах - тоже, мягко говоря, не очень
...
Рейтинг: 0 / 0
22.11.2014, 18:17:02
    #38814146
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
tanglirsharmanka,

поздравляю, вы изобрели велосипедEAV :)
альтернатива - сделать одну таблицу, где свойства будут в столбцах - тоже, мягко говоря, не очень
А что будет очень (ну кроме предложения забыть про реляционные бд и перейти к документарным :) ) ?
...
Рейтинг: 0 / 0
22.11.2014, 18:24:08
    #38814149
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
tanglir , это он изобрёл не EAV, а что-то ещё более монстрообразное и дикое. На каждый тип атрибута - своя таблица, убиться можно!

sharmankaМожет есть какое-то более оптимальное решение?
Классический EAV. Ознакомьтесь...
...
Рейтинг: 0 / 0
22.11.2014, 19:02:41
    #38814164
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
sharmankaА что будет оченьА ничего. Прислушайтесь к совету Акины и почитайте про еав, каким он должен быть.
...
Рейтинг: 0 / 0
23.11.2014, 14:28:57
    #38814385
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите со структурой БД
sharmankaТогда запрос на вывод товаров по критериям будет выглядеть примерно так:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM products 
LEFT JOIN `connect` ON `products`.id = `connect`.product_id
LEFT JOIN `weight` ON `weight`.id = `connect`.value_id AND `connect`.type_id = 1
LEFT JOIN `length` ON `length` .id = `connect`.value_id AND `connect`.type_id = 2
....



Нутром чую, что производительность такого решения будет мягко говоря "неочень"даже с индексами :)


Твоё нутро тебя подводит:

Код: sql
1.
2.
3.
4.
5.
SELECT * FROM products 
JOIN `connect` ON `products`.id = `connect`.product_id
JOIN `weight` ON `weight`.id = `connect`.value_id AND `connect`.type_id = 1
JOIN `length` ON `length` .id = `connect`.value_id AND `connect`.type_id = 2
....



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


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