Как лучше спроектировать несколько таблиц в БД mysql

Статус
В этой теме нельзя размещать новые ответы.
допустим бампер который может присутствовать как у мерса 200... мерса 600... так и у ВАЗ 2109 ...и тд и т п...

Значения таблицы d (для удобства приведены значения поля name, которые лучше хранить в таблице h и ссылаться на них из d по id_name:(

id_m name id_dn
1 ...
1 универсальный супер-бампер к МЕРИНАМ и ВАЗам 111
1 ...
111 ....
111 мерин 222
111 ВАЗ 333
111 ...
222 ...
222 мерин-200 NULL
222 мерин-600 NULL
222 ...
333 ...
333 2109 NULL
333 2108 NULL
333 ...

или марка ваз .. модель2109..
бампер передний..бампер задний ..бампер хромированный..бампер серия 12345...

id_m name id_dn
1 ...
1 бампер передний 111
1 бампер задний 111
1 бампер хромированный 111
1 ...
111 ...
111 ВАЗ 222
111 ...
222 ...
222 2109 NULL
222 ...

тормоз ручной модель 1234567 относится и к ваз 2109, и к ваз 2108, и к ваз 1234567...

id_m name id_dn
1 ...
1 тормоз ручной модель-1234567 111
1 ...
111 ...
111 ВАЗ 222
111 ...
222 ...
222 2109 NULL
222 2108 NULL
222 ...

На примере супербампера для мерина и ваза.

Стартовое меню - 1 ($id=1). Вытаскиваем из d пункты меню с id_m равным id:
Код:
SELECT * FROM d WHERE id_m = $id;
Вытащим
1 ...
1 универсальный супер-бампер к МЕРИНАМ и ВАЗам 111
1 ...

Выбираем конкретный пункт меню - пусть пункт с d.id_dn=111. Присваиваем $id значение 111 и вытаскиваем
пункты меню следующего уровня:
Код:
SELECT * FROM d WHERE id_m = $id;
То есть вытащим
111 ....
111 мерин 222
111 ВАЗ 333
111 ...

Выбираем пункт меню - с d.id_dn=222. Присваиваем $id значение 222 и вытаскиваем очередное меню:
Код:
SELECT * FROM d WHERE id_m = $id;
Тем самым вытащим меню третьего уровня, т.е.

222 ...
222 мерин-200 NULL
222 мерин-600 NULL
222 ...

to serjinio и в чем именно вы видите мою ошибку?
 
Вы меня не поняли...попробуйте по вашему сценарию построить дерево(меню) тогда поймете почему сущности надо хранить в отдельных таблицах и использовать таблицу связей сущностей...
 
Вы меня не поняли...попробуйте по вашему сценарию построить дерево(меню) тогда поймете почему сущности надо хранить в отдельных таблицах и использовать таблицу связей сущностей...

Как же тебя понять, коль ты ничего не говоришь?
(c) Иоанн Грозный, к/ф "Иван Васильевич меняет профессию"

В последнем моём посте как раз приведено дерево меню. Остается посоветовать вам изучить приведенный пример внимательнее.
А вообще хочется посмотреть конкретное описание вашего варианта решения - структуру таблиц, их наполнение, что и чем по каким полям связано. Я то все это проделал, и на все ваши вопросы ответил. А на свои вопросы ответа не получил. Читаю только многозначительные и неконкретные посты типа
Ищите по запросу....
связь многие -ко -многим...
рекруссия...
у вас получится 3 таблицы и таблица связи... итого 4 таблицы...
или же неконкретные рекомендации
А вы попробуйте вывести меню в вашем варианте и поймете в чем ошибка...
Я то попробовал - как видите, получается. И вам советую попробовать вывести меню в моем варианте :)
Представьте пожалуйста описание вашего варианта решения. И просьба обязательно пояснить, какой именно момент решается вашим вариантом, но не решается вариантом, предлагаемым мной.
 
HTML:
brand
id_b   b_name
1        ВАЗ
2        Мерс
3        УАЗ

model
id_mod   mod_name
1          2109
2          2108
3          600

hardware
id_h     h_name               serial_number
1       бампер эадний            1234   
2       бампер передний          678
3       трамплер                 98711
4       ступица                  zz345

link
id_b  id_mod     id_h
1         1        1     (ВАЗ    2109  бампер эадний 1234  )
1         2        1     (ВАЗ    2108  бампер эадний 1234  )
2         3        3     (Мерс  600    трамплер 98711  )
2         3        4     (Мерс  600    ступица  zz345 )

все по id_b=1        выбираем по ВАЗ
все по id_b=2        выбираем по Мерсу...
все по id_mod= 3     выбираем по Мерс  600....
все по id_mod= 1     выбираем по ВАЗ    2109...
все по id_h=  1      выбираем детали которые подходят для разных машин 
(в частности .ВАЗ2109. и .ВАЗ 2108.)
 
1. Внимательно читаем первый пост:
Есть трехуровневое меню:
запчасть - Марка автомобиля - тип автомобиля
Например
бампер - Ваз - 2109
капот -mersedes - 600
Как лучше спроектировать таблицу, чтобы сразу в меню выводить эти три уровня? И т.д.
Откуда взялось требование выбирать, например, "детали которые подходят для разных машин"? У ТС этого нет! Ему нужно трехуровневое меню, чтоб в первом уровне были запчасти, во втором марки авто, в третьем модели авто ("типы авто", как у ТС).

2. Если вы примените ваш же совет к себе
...попробуйте по вашему сценарию построить дерево(меню) тогда поймете почему сущности надо хранить в отдельных таблицах и использовать таблицу связей сущностей...
и продолжите ваш пример дальше, то заметите, что таблица link будет содержать декартово произведение записей таблиц brand, model, hardware. Количество записей link будет больше, чем в таблице d, предлагаемой мной.

Простой пример - пусть меню будет двухуровневым:

Запчасти
id_h h_name
1 Тормоз ручной-123
2 Стойка-456

Марки
id_b b_name
1 ВАЗ
2 КАМАЗ
3 Газель
4 Волга

Таблица link будет содержать 2*4 = 8 записей:

link
id_h id_b
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4

В таблице d будет 6 записей:

id_m name id_dn
1 Тормоз ручной-123 111
1 Стойка-456 111
111 ВАЗ NULL
111 КАМАЗ NULL
111 Газель NULL
111 Волга NULL

Использование таблицы d позволяет повторно использовать существующие меню, просто ссылаясь на них, а не создавая новые меню, как с таблицей link. Это значительно уменьшает количество записей, следовательно нагрузку на сервер, о чем просит ТС.

И потом - меню и пункт меню связаны косвенной рекурсией. А рекурсивные данные, как известно, хорошо представляются рекурсивными структурами. В данном случае таблицей d, значения поля id_dn которой ссылаются на себя, на первое поле id_m. В нее легко добавить призвольное количество уровней меню. Структура таблицы при этом не изменяется. В то время в вашем варианте решения для добавления нового уровня меню придется дополнительно создавать новую таблицу и новое поле в link.

3. Что касается различных выборок, хоть о них ТС и не просил, но, например, всю информацию по модели 2109 (и другие ваши примеры выборок) вытаскивается через самообъединение таблицы d.
 
оба варианта имеют права на жизнь...
ну теперь пора дать возможность ТС самому определиться что ему больше подойдет....:)
 
Непонятно, откуда возьмутся 100 запросов? Запросов будет три - по одному на раскрытие каждого уровня меню.
Вытаскиваются названия запчастей (один запрос). Выбрали в меню "запчасти" запчасть - конкретный пункт меню - вытаскиваем следующее меню с id = id_dn (второй запрос). Выбрали марку для данной запчасти - конкретный пункт меню второго уровня - по id_dn пункта вытаскиваем меню типов машин выбранной запчасти выбранной марки (третий запрос).

Я планирую сразу выводить трехуровневое меню в менюшке. В этом случае придется для каждого элемента меню первого уровня делать подзапрос на элементы второго и третьего уровня. Сначала часть информации будет скрыта ява скприптом. Но при нажатии на плюсик (+) С помощью Ява скрипта будет раскрываться субменю.
Возникла идея выполнять кеширование этой менюшки. И обновлять менюшку только при добавлении нового элемента. Что скажете ?
 
Почитайте про деревья
Я б в вашем случае обратил внимание на способ NESTED SETS (вложенные множества)
 
Я планирую сразу выводить трехуровневое меню в менюшке. В этом случае придется для каждого элемента меню первого уровня делать подзапрос на элементы второго и третьего уровня. Сначала часть информации будет скрыта ява скприптом. Но при нажатии на плюсик (+) С помощью Ява скрипта будет раскрываться субменю.
Возникла идея выполнять кеширование этой менюшки. И обновлять менюшку только при добавлении нового элемента. Что скажете ?

Верно ли я понял, что вы хотите всю информацию о трех уровнях меню сразу отдавать браузеру, а затем в нем с помощью ява-скрипта разбираться, что выводить в подменю? Если это так и если меню большие, это сколько будет грузится вначале такая страница?! Не лучше делать такую страницу с помощью AJAX, чтоб не было перезагрузки страницы и вначале грузить только меню первого уровня? По [+] будет запрашивается нужно меню второго уровня и раскрываться и т.д?
И что означает "обновлять менюшку только при добавлении нового элемента"? Меню ведь отображается в браузере, а хранится в мускуле на сервере. Через админку добавите, а при чтении страницы обновленное меню и загрузится.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху