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

Тема в разделе "Базы данных", создана пользователем dandandan, 17 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dandandan

    dandandan

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

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Ищите по запросу....
    связь многие -ко -многим...
    рекруссия...

    у вас получится 3 таблицы и таблица связи... итого 4 таблицы...
     
    dandandan нравится это.
  3. pavel012007

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    Достаточно двух таблиц.

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

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

    Номер текущего меню содержится в переменной программы $id.
    Вытаскиваем названия пунктов данного меню:

    SELECT * FROM m INNER JOIN d ON (m.id=d.id_m) WHERE m.id = $id;
    Пользователь переходит на уровень ниже - $id присваиваем значение выбранного запросом id_dn. Пользователь переходит на уровень выше - $id присваиваем id_up.
    Значения id_up и id_dn можно выбирать и только из таблицы m:

    SELECT * FROM m WHERE id=$id

    Чтобы получить названия пунктов нового текущего меню, еще раз выполняем первый запрос.
     
    dandandan нравится это.
  4. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    Достаточно одной таблицы. Просто при открывании того или иного пункта меню делать группировку по нужному параметру: тип автомобиля, бампер или капот.
     
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    а как с наименьшей нагрузкой на сервер реализовать обход по всем 3 элементам меню
    т.е. получить полное трехуровневое меню. например:
    бампер передний
    - ВАЗ
    - 2109
    -2110
    -2111
    -Мерседес
    --300
    --600
    --610
    Можно ли сделать такое через 1 запрос. Или еще как то?

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

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    Можно привести структуру предлагаемой вами таблицы?

    Предложенными двумя таблицами можно сделать меню любого уровня, не только 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 пункта вытаскиваем меню типов машин выбранной запчасти выбранной марки (третий запрос).
     
  7. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Интересно а как вы двумя таблицами реализуете хранение и выборку..допустим бампер который может присутствовать как у мерса 200... мерса 600... так и у ВАЗ 2109 ...и тд и т п...

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

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    Пример значений таблицы 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 (по-прежнему две таблицы)
     
  9. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    А вы попробуйте вывести меню в вашем варианте и поймете в чем ошибка...
     
  10. aeromouse

    aeromouse Постоялец

    Регистр.:
    18 апр 2007
    Сообщения:
    98
    Симпатии:
    12
    в нотепаде попробуйте. ) иногда так и делаю когда надо визуально подредактировать базы, правда небольшие.
     
Статус темы:
Закрыта.