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

Статус
В этой теме нельзя размещать новые ответы.

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Есть трехуровневое меню:
запчасть - Марка автомобиля - тип автомобиля
Например
бампер - Ваз - 2109
капот -mersedes - 600
Как лучше спроектировать таблицу, чтобы сразу в меню выводить эти три уровня?
Самый простой вариант, который я вижу - это Создать 3 таблицы. Каждая таблица содержит названия каждого уровня меню. Сначала выбирать данные из первой таблицы При выборе каждой ячейки начинать выбирать данные 2-ой таблицы, а при переборе 2ой таблицы - выбирать данные 3-ей таблицы. Т.е. получается Двойной Цикла в цикле. Думаю это не очень хорошо сказывается на нагрузку веб сервера. Может быть есть более простые и менее нагруженные способы? Буду ждать ваших ответов.
 
Ищите по запросу....
связь многие -ко -многим...
рекруссия...

у вас получится 3 таблицы и таблица связи... итого 4 таблицы...
 
Достаточно двух таблиц.

Таблица m. Поля:
id - уникальный номер текущего меню
id_up - id меню уровнем выше,
id_dn - id меню уровнем ниже.
sp - как выводить пункты меню (горизонтально/вертикально)

Таблица d. Поля:
id_m - значение m.id
name - название пункта меню

Номер текущего меню содержится в переменной программы $id.
Вытаскиваем названия пунктов данного меню:
Пользователь переходит на уровень ниже - $id присваиваем значение выбранного запросом id_dn. Пользователь переходит на уровень выше - $id присваиваем id_up.
Значения id_up и id_dn можно выбирать и только из таблицы m:

Чтобы получить названия пунктов нового текущего меню, еще раз выполняем первый запрос.
 
Достаточно одной таблицы. Просто при открывании того или иного пункта меню делать группировку по нужному параметру: тип автомобиля, бампер или капот.
 
а как с наименьшей нагрузкой на сервер реализовать обход по всем 3 элементам меню
т.е. получить полное трехуровневое меню. например:
бампер передний
- ВАЗ
- 2109
-2110
-2111
-Мерседес
--300
--600
--610
Можно ли сделать такое через 1 запрос. Или еще как то?

Добавлено через 4 минуты
Достаточно двух таблиц.
А чем использование 2 таблиц лучше, чем использование 4 таблиц, предложенных serjinio?
Меня интересует в данном случае минимизация нагрузки как на апач, так и на mysql сервер. Менюшки предполагаются очень большие... А выполнение, например 100 запросов при открытии страницы, наверено это будет многовато. :)
 
Достаточно одной таблицы. Просто при открывании того или иного пункта меню делать группировку по нужному параметру: тип автомобиля, бампер или капот.

Можно привести структуру предлагаемой вами таблицы?

А чем использование 2 таблиц лучше, чем использование 4 таблиц, предложенных serjinio?

Меня интересует в данном случае минимизация нагрузки как на апач, так и на mysql сервер. Менюшки предполагаются очень большие... А выполнение, например 100 запросов при открытии страницы, наверено это будет многовато. :)

Предложенными двумя таблицами можно сделать меню любого уровня, не только 3-х уровневое. Если вам придется делать меню четырехуровневым, придется заводить еще таблицу. Что менее универсально.

Небольшая неточность - id_dn нужно перенести в таблицу d. Это логично - ведь меню нужно раскрывать для выбранного пункта текущего меню $id:

Таблица m. Поля:
id - уникальный номер текущего меню
id_up - id меню уровнем выше,
sp - как выводить пункты меню (горизонтально/вертикально)

Таблица d. Поля:
id_m - значение m.id
name - название пункта меню
id_dn - id меню уровнем ниже.

Непонятно, откуда возьмутся 100 запросов? Запросов будет три - по одному на раскрытие каждого уровня меню.
Вытаскиваются названия запчастей (один запрос). Выбрали в меню "запчасти" запчасть - конкретный пункт меню - вытаскиваем следующее меню с id = id_dn (второй запрос). Выбрали марку для данной запчасти - конкретный пункт меню второго уровня - по id_dn пункта вытаскиваем меню типов машин выбранной запчасти выбранной марки (третий запрос).
 
Интересно а как вы двумя таблицами реализуете хранение и выборку..допустим бампер который может присутствовать как у мерса 200... мерса 600... так и у ВАЗ 2109 ...и тд и т п...

или марка ваз .. модель2109..
бампер передний..бампер задний ..бампер хромированный..бампер серия 12345...
или тормоз ручной модель 1234567 относится и к ваз 2109...и к ваз 2108.... и к ваз 1234567...
 
Интересно а как вы двумя таблицами реализуете хранение и выборку..допустим бампер который может присутствовать как у мерса 200... мерса 600... так и у ВАЗ 2109 ...и тд и т п...

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

Пример значений таблицы d:
id_m name id_dn
1 бампер 10
1 амортизатор 20
1 шина 30
10 ОКА 555
10 ВАЗ 200
10 КАМАЗ 777
200 2109 NULL
200 2108 NULL

Идея понятна?

В принципе таблица m хранит информацию, на какое меню верхнего уровня переходить при выходе из текущего меню. Но эту информацию можно извлечь и из таблицы d:

Код:
SELECT distinct id_m FROM d WHERE id_dn=$id;

В результате получаем id родительского меню.
А чтобы не было дублирований значений в d.name, можно завести таблицу-справочник h (id-уникальное, name). В нее заносятся названия всех бамперов, шин, всех марок машин, всех типов машин. Структура таблицы d тогда примет вид:

id_m - значение m.id
id_name - значение h.id
id_dn - id меню уровнем ниже.

То есть:
1. Таблица m не нужна.
2. Достаточно таблиц d и h (по-прежнему две таблицы)
 
А вы попробуйте вывести меню в вашем варианте и поймете в чем ошибка...
 
в нотепаде попробуйте. ) иногда так и делаю когда надо визуально подредактировать базы, правда небольшие.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху