powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите с проектированием БД или просто нужен хитрый запрос.
21 сообщений из 21, страница 1 из 1
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850691
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Помогите пожалуйста с таким вопросом.

Проектирую небольшой каталог товаров. Прилагаю схему БД.

Есть таблица свойств "katalog_prop". Например есть свойство у товара "Размер экрана".
Есть таблица со значениями для свойства "katalog_prop_value". Например "10 дюймом, 11 дюймов, 14 дюймов" и т.д..
Есть таблица с категориями "katalog_prop_cat" для которых определённые свойства используются.

Вот тут я упёрся в тупик в котором уже вторую неделю хожу.

Например есть свойство которое используется в двух категориях "Телефоны" и "Ноутбуки" и пользователь вдруг решает удалить одну категорию у свойства, например "Телефоны". Далее по логике мне нужно снести все свойства у позиции для этой категории. Да с этим проблем нет.

Код: sql
1.
2.
3.
DELETE katalog_prop_add FROM katalog_prop_add
LEFT JOIN katalog_cat_add ON katalog_cat_add.id_cat IN (ID категорий)
WHERE katalog_prop_add.id_data = katalog_cat_add.id_data && katalog_prop_add.id_prop = ID свойства
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850698
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но в то же время сама позиция может относится к категориям "Телефоны" и "Ноутбуки" и получается что что свойства для категории "Ноутбуки" удалять не нужно.

Тут может быть какой то хитрый запрос с проверкой нужен. Спасибо. Очень надеюсь на Вашу помощь.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850723
Prog_95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dok11Но в то же время сама позиция может относится к категориям "Телефоны" и "Ноутбуки" и получается что что свойства для категории "Ноутбуки" удалять не нужно.

Тут может быть какой то хитрый запрос с проверкой нужен. Спасибо. Очень надеюсь на Вашу помощь.
Решение в лоб - "двух-этажный" запрос:
1. Выбираете все позиции, у которых категория "Ноутбуки"
2. В Ваш запрос в условие "где" добавляете " и не в списке", подставляя таблицу, полученную на первом "этаже" (результатом запроса всегда является таблица...)
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850725
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не пытайся всё завернуть в один запрос и задача существенно упростится. Делай
процедуру, которая пробежится по выборке свойств, принадлежащих данной удаляемой
категории, и удалит все значения этих свойств, а потом и сами свойства. Всё: один
мегахитрый запрос распался на три тривиальных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850787
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prog_95,

автор1. Выбираете все позиции, у которых категория "Ноутбуки"


Да в том то и дело что я заранее не знаю в каких ещё категориях состоят позиции.
Ведь позиций много и позиции могут относиться к нескольким категориям.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850798
Prog_95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dok11Prog_95,

автор1. Выбираете все позиции, у которых категория "Ноутбуки"


Да в том то и дело что я заранее не знаю в каких ещё категориях состоят позиции.
Ведь позиций много и позиции могут относиться к нескольким категориям.
Тогда на первом этапе запрос немного усложнится: нужно выбрать все позиции у которых есть категория "Телефоны" (та, которая удаляется) И какие-нибудь другие.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850801
Prog_95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА ты не пытайся всё завернуть в один запрос и задача существенно упростится. Делай
процедуру, которая пробежится по выборке свойств, принадлежащих данной удаляемой
категории, и удалит все значения этих свойств, а потом и сами свойства. Всё: один
мегахитрый запрос распался на три тривиальных.

Дело в том, что выборка одним запросом практически всегда и во всех СУБД является на порядок (а иногда и два-три порядка) более быстрой...
А умение составлять запросы SQL - так называемое "мышление множествами" - это увлекательная гимнастика для ума... (понимаю, что не для всех...(
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850813
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prog_95Дело в том, что выборка одним запросом практически всегда и во всех СУБД
является на порядок (а иногда и два-три порядка) более быстрой...
Вот только бредить не надо. Если у MS SQL безбожно тормозит работа с курсорами, это не
повод обобщать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850827
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тут вы нас обманываете:
авторНапример есть свойство которое используется в двух категориях "Телефоны" и "Ноутбуки" и пользователь вдруг решает удалить одну категорию у свойства
Нужно подправить структуру БД. По задаче категории свойств katalog_prop_cat должны соотноситься с категориям товаров katalog_cat .
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850839
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
katalog_prop_cat - не совсем пойму зачем..

Свойства katalog_prop должны соотноситься с категориями товаров katalog_cat прямо или косвенно.
Связав таблицы(многие-ко-многим), можно будет ответить на вопрос: какие свойства относятся к данной категории товаров? . Пока это не очевидно,на данный момент связь производится непосредственно через товары, если правильно понял.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850861
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят спасибо кто откликнулся. Я сегодня на работе (ночью) более подробно опишу мою трудность наверное в картинке всё визуально изображу и завтра утром вложу. А то я наверное не совсем чётко описал проблему.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38850950
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11,

Сдаётся мне, что БД спроектирована не правильно, отсюда и траблы с запросами.

На первый взгляд:
1. Определись с именованием таблиц - у тебя вырви-глаз, а не наименования, даже смотреть не приятно.
2. В таблицах связи отношений М-то-M(katalog_cat_add, katalog_prop_add, katalog_prop_cat) поле ID не нужно.
3. Через таблицу katalog_prop_cat у тебя образуется кольцо на схеме, хотя на схеме это и не указано, но судя по логике у тебя
соединяются по двум путям таблицы catalog_prop и catalog_cat - а " это залёт, боец! "

В общем, прежде чем разбираться с "хитрым запросом", сделай нормальную БД, тогда и хитрые запросы не понадобятся.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38851291
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feomatrkatalog_prop_cat - не совсем пойму зачем..

Более подробно ниже что зачем..

zeon11Сдаётся мне, что БД спроектирована не правильно, отсюда и траблы с запросами.

На первый взгляд:
1. Определись с именованием таблиц - у тебя вырви-глаз, а не наименования, даже смотреть не приятно.
2. В таблицах связи отношений М-то-M(katalog_cat_add, katalog_prop_add, katalog_prop_cat) поле ID не нужно.
3. Через таблицу katalog_prop_cat у тебя образуется кольцо на схеме, хотя на схеме это и не указано, но судя по логике у тебя
соединяются по двум путям таблицы catalog_prop и catalog_cat - а "это залёт, боец!"


1. Да, согласен, может быть, но как всегда бывает начнёшь что нибудь проектировать - быстро назовёшь таблицы, мол потом переименую, а потом уже в во всех местах времени нет править.
2. Да, согласен я об этом знаю, не помню зачем мы вводили ID шники, но для чего-то они использовались, и пока не мешают. При конечной отладке может и уберём.
3. Не совсем понял, эти таблицы во общем то к друг другу не имеют отношения.

zeon11В общем, прежде чем разбираться с "хитрым запросом", сделай нормальную БД, тогда и хитрые запросы не понадобятся.

Да я и прошу помощи по этому вопросу. Не подумайте что я хочу готовое решение на халяву, просто хоть направьте в нужную сторону как правильно нужно сделать, больше просто неукого спросить, а сам я реально не могу сообразить.

Что интересно видел похожий движок инет магазина, они там вообще всё в базе оставляют, то есть удалили свойство, а значения сами в БД зависли (записи призраки) :). Движок то популярный, а такие косяки...


Теперь еще раз попробую объяснить.

Таблица "katalog_data" это сам товар в каталоге.
Таблица "katalog_cat" это категории каталога.
Таблица "katalog_cat_add" это таблица связи Позиция каталога - Категории , то есть товар может одновременно относится к нескольким категориям (виден в них).

Всё это пока оставим. Здесь всё просто.

Далее...

Приложена картинка которая объясняет свойства товара и зачем они нужны и т.д..

Да, ещё есть таблица "katalog_prop_add" которая хранит значения выбранных свойств для определённой позиции.
id_data - это ID товара
id_prop - это ID свойства (родитель значения)
id_val_prop - это значение свойства из таблицы "id_prop_value"

Далее.. теперь на время оставим связи таблиц. Просто логика:
1. Если чел. удаляет всё свойство из системы, то мы сносим из таблицы "katalog_prop_add" все записи для id_prop, ну с остальных таблиц тоже легко всё почистить.
2. Если чел. удаляет значения из свойства тоже легко всё чиститься из всех таблиц.
И т.д.

Теперь то до чего я не могу допетрить.

Допустим у нас есть товар "Музыкальный центр" который одновременно относится к примеру к 2-ум категориям "Теле Аудио Видео" и "Бытовая техника". У него могут быть и другие категории это не важно по сути.

И вдруг чел. решает у свойства "Мощность прибора" удалить категорию "Теле Аудио Видео". Соответственно по логике нужно снести для товара из таблицы "katalog_prop_add" все значения этого свойства. Да, нет пока с этим проблем.
Код: sql
1.
2.
3.
DELETE katalog_prop_add FROM katalog_prop_add
LEFT JOIN katalog_cat_add ON katalog_cat_add.id_cat IN (ID категорий)
WHERE katalog_prop_add.id_data = katalog_cat_add.id_data && katalog_prop_add.id_prop = ID свойства



НО товар также ещё относиться и к категории "Бытовая техника" для которого это свойство ещё актуально, и по сути в данном случае значения свойств пока сносить не нужно.

Вот как проверить этот момент? Блин объяснил как мог, помогите хоть чем сможете, я уже скоро с катушек съеду.
Даже если не в 1 запрос, а 2-3, но как это можно проверять? Или в натуре со структурой БД как то по другому делать. Заранее Спасибо!
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38851307
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11Вот как проверить этот момент?
Код: sql
1.
2.
3.
4.
delete from katalog_prop_add
where id_prop in (select from  где там у тебя связь свойства с категорией)
and not exists (select * from katalog_cat_add where katalog_prop_add.id_data = 
katalog_cat_add.id_data and katalog_prop_add.id_cat <> :id_удаляемой категории)


То есть удалить все значения свойств удаляемой категории для которых у товаров нет другой
категории кроме заданной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38851392
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
delete from katalog_prop_add
where id_prop in (select from  где там у тебя связь свойства с категорией)
and not exists (select * from katalog_cat_add where katalog_prop_add.id_data = 
katalog_cat_add.id_data and katalog_prop_add.id_cat <> :id_удаляемой категории)


То есть удалить все значения свойств удаляемой категории для которых у товаров нет другой
категории кроме заданной.


Очуметь, я даже представить не мог что так можно делать, спасибо, вот так вроде то что нужно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DELETE FROM `katalog_prop_add`
WHERE `id_prop` IN (SELECT `id_prop` FROM `katalog_prop_cat` WHERE `id_prop` = ID свойства)
AND NOT EXISTS (
	SELECT * FROM `katalog_cat_add`
	WHERE 
		`katalog_prop_add`.`id_data` = `katalog_cat_add`.`id_data` AND 
		`katalog_cat_add`.`id_cat` NOT IN (ID удаляемых категорий)
	)



Спасибо, похоже нужно sql подтянуть ещё в плане изучения. Буду ещё тестировать всё.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38851942
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот еще вопрос, маленько не по теме.

При редактировании товара приходится проверять какие свойства:
1. Какие остались - Обновить.
2. Какие удалили - Снести.
3. Какие добавили Добавить.
Довольно много движухи.

Можно просто полностью сносить все свойства у товара и добавлять по новой - ЧТО ГОРАЗДО ПРОЩЕ.

Вот посчитал что - если даже в базу будет залетать в секунду по записи, то за 100 лет это 3153 600 000 записей что намного меньше числа поля BIGINT unsigned (18446744073709551615)

Так может не парится - и делать как проще?
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38852204
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11,

Иная простота хуже воровства. Это не красиво, а значит не правильно.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38852210
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не жадничай. Сделай не M:M а 1:М для свойств. Будет "размер экрана монитора" и "размер экрана телефона"
а иначе юзеры озвереют выбирать в списке мощности из "20 wt, 100 wt pmpo, 10 KWt, 125 л.с." и т.п.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38852292
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zeon11Иная простота хуже воровства. Это не красиво, а значит не правильно.
???
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38852293
dok11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durakне жадничай. Сделай не M:M а 1:М для свойств. Будет "размер экрана монитора" и "размер экрана телефона"
а иначе юзеры озвереют выбирать в списке мощности из "20 wt, 100 wt pmpo, 10 KWt, 125 л.с." и т.п.

Ну так и есть.
Можно же зависти разные свойства.
...
Рейтинг: 0 / 0
Помогите с проектированием БД или просто нужен хитрый запрос.
    #38852686
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dok11Ivan Durakне жадничай. Сделай не M:M а 1:М для свойств. Будет "размер экрана монитора" и "размер экрана телефона"
а иначе юзеры озвереют выбирать в списке мощности из "20 wt, 100 wt pmpo, 10 KWt, 125 л.с." и т.п.

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


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