Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с проектированием базы данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
jonston
Отправлено: 07 Мая, 2011 - 14:14:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Всем привет!Есть такое задание:

Товары на сайт интернет-магазина сгруппированы по категориям. Категории организованы в древовидную структуру с уровнем вложенности до 4 включительно. Значимые атрибуты категории: название. Значимые атрибуты товара: название и цена. Один продукт может относиться к нескольким категориям.
1. Разработать структуру базы данных MySQL для хранения дерева категорий, списка продуктов и информации о принадлежности продуктов к категориям.
2. Заполнить таблицы тестовыми данными.
3. Написать SQL-запросы для получения следующих данных:
a. Для заданного списка товаров получить названия всех категорий, в которых представлены товары;
b. Для заданной категории получить список предложений всех товаров из этой категории и ее дочерних категорий;
c. Для заданного списка категорий получить количество предложений товаров в каждой категории;
d. Для заданного списка категорий получить общее количество уникальных предложений товара;
e. Для заданной категории получить ее полный путь в дереве (breadcrumb, «хлебные крошки»).
4. Проверить и обосновать оптимальность запросов.

Подскажите чем кто может!Может мануал есть хороший по проектированию бд интернет магазинов.Или У кого-то опыт хороший имеется в этом деле!

(Отредактировано автором: 07 Мая, 2011 - 14:15:47)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Мелкий Супермодератор
Отправлено: 07 Мая, 2011 - 14:25:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




jonston пишет:
Может мануал есть хороший по проектированию бд

Вот именно так и ищите. Проектирование БД - всегда проектирование БД и принципы там одни и те же.

Для представленной задачи: таблица категорий (включая простое дерево с рекурсивным обходом), таблица товаров, таблица связи товар-категория.

jonston пишет:
4. Проверить и обосновать оптимальность запросов.

заслуживает отдельного рассмотрения:
оптимальность затраченных усилий к скорости обработки результата или максимально оптимальный запрос. Во втором случае - курите что-нибудь типа NESTED SETS.


-----
PostgreSQL DBA
 
 Top
jonston
Отправлено: 07 Мая, 2011 - 14:30:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Мелкий пишет:
jonston пишет:
Может мануал есть хороший по проектированию бд

Вот именно так и ищите. Проектирование БД - всегда проектирование БД и принципы там одни и те же.

Для представленной задачи: таблица категорий (включая простое дерево с рекурсивным обходом), таблица товаров, таблица связи товар-категория.

jonston пишет:
4. Проверить и обосновать оптимальность запросов.

заслуживает отдельного рассмотрения:
оптимальность затраченных усилий к скорости обработки результата или максимально оптимальный запрос. Во втором случае - курите что-нибудь типа NESTED SETS.


спасибо!


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 07 Мая, 2011 - 14:58:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




По поводу оптимизации могу рекомендовать
http://habrahabr[dot]ru/blogs/mysql/76861/
А для лучшего понимания SQL можете использовать для начала
http://www[dot]mysql[dot]ru/docs/gruber/


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Agile
Отправлено: 30 Августа, 2011 - 07:45:00
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Самое правильное хранения деревьев в базе это такое:

Создадим таблицу в БД. Где два поля (не считая идентификатора) одно поле - категория, второе поле - родитель категории. На самом деле этого достаточно что бы хранить дерево с любыми уровнями вложенности.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. id|namegroup                      |parent
  3.  
  4. 1|Электронные компоненты          |""
  5. 2|Инструменты                     |Электронные компоненты
  6. 3|Паяльное оборудование           |Инструменты
  7. 4|Администраторы                  |""
  8. 5|Модераторы                      |Администраторы
  9. 6|Тестеры                         |Модераторы
  10.  

Сейчас мы запихали вот такое дерево с тремя уровнями в базу


1Электронные компоненты
1.1-Инструменты
1.1.1--Паяльное оборудование
2Администраторы
2.1-Модераторы
2.1.1--Тестеры

Как видим, сколько бы уровней не было в дереве оно все будет успешно храниться в двух полях.

Собрать обратно дерево тоже не так сложно вот пример как это реализовано у меня:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $res = mysql_query("SELECT * FROM table_catalog;"); // Сделаем выборку данных
  3. while ($array = mysql_fetch_array($res)) // В цикле
  4. {
  5.        $arr_cat[$array['namegroup']]=$array['parent'];//читаем весь каталог в массив
  6. }
  7. foreach ($arr_cat as $namegroup =>$parent)
  8. {      
  9.        if($namegroup!=null && $parent==null)$catalog[$namegroup]=null;//создадим первый уровень
  10.        foreach ($catalog as $key =>$value)//создадим второй уровень
  11.                {
  12.                        if($key==$parent)$catalog[$key][$namegroup]=null;       
  13.                        if(is_array($catalog[$key]))
  14.                        foreach ($catalog[$key] as $key1 =>$value1)//создадим третий уровень
  15.                        {
  16.                              if($key1==$parent)$catalog[$key][$key1][$namegroup]=null;
  17.                              if(is_array($catalog[$key][$key1]))
  18.                              foreach ($catalog[$key][$key1] as $key2 =>$value2)//создадим четвертый уровень
  19.                                 {
  20.                                         if($key2==$parent)$catalog[$key][$key1][$key2][$namegroup]=null;
  21.                                         if(is_array($catalog[$key][$key1][$key2]))
  22.                                                 {
  23.                                                       foreach ($catalog[$key][$key1][$key2] as $key3 =>$value3)//создадим пятый уровень
  24.                                         {
  25.                                                                                                 if($key3==$parent)$catalog[$key][$key1][$key2][$key3][$namegroup]=null;
  26.                                         }
  27.                                 }
  28.                         }
  29.                }
  30.         }
  31. }
  32.  
  33.                         print_r($catalog);
  34.  


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

На выходе получили многомерный массив который и является деревом. Для вывода массива в виде дерева для пользователя пользуйтесь рекурсией, рекурсию допишите сами, вот пример:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function encoding(&$data)
  3. {
  4.    if (is_array($date))
  5.    {
  6.        foreach($data as $key => $value)
  7.        {
  8.            if ( is_array($data[$key]) )
  9.            {
  10.                encoding($data[$key]);
  11.             }
  12.         }
  13.     }
  14. }
  15.     encoding($objects);
  16.  

Если не нравиться рекурсия то можно обойти многомерный массив так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. foreach($array as $key => $value)//обходим массив, выводим
  3.     {
  4.     foreach ($value as $key1 => $value1)
  5.         {
  6.  
  7.                 }
  8.     }
  9.  

(Отредактировано автором: 30 Августа, 2011 - 13:25:51)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB