Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Каталог в CMS


Автор: Truniger 24.4.2013, 22:41
Здравствуйте! В веб программировании я совсем не давно, сейчас занимаюсь написанием CMS для каталога с платным скачиванием (продажа файлов), по сути это мой первый проект веб что касается именно программирования, поэтому я учусь прямо походу. Использую объектно ориентированное программирование php+mysql (с языком тоже знакомлюсь впервые, поэтому прошу извинить за глупые вопрос, если таковые будут  smile ). На данный момент реализовал пользовательскую часть сайта кроме каталога, админку с возможностью редактирования всех пунктов меню и простенькую авторизацию. В общем, я сделал все кроме непосредственно каталога, ведь как я понимаю реализовывать каталог нужно тоже через БД, но мне нужен каталог с категориями и вложенными в них подкатегориями, и возникает вопрос как реализовать это в mysql? Получается, что в ячейке таблицы должна быть новая таблица.

PS:Извините если непонятно объясняю, заранее спасибо!   smile 

Автор: Arantir 24.4.2013, 23:10
Цитата(Truniger @  24.4.2013,  21:41 Найти цитируемый пост)
Получается, что в ячейке таблицы должна быть новая таблица.

Почитайте о том, что такое https://www.google.com.ua/search?q=%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F+%D0%B1%D0%B4&aq=f&oq=%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F+%D0%B1%D0%B4&aqs=chrome.0.57j62l2.3281j0&sourceid=chrome&ie=UTF-8. А mysql именно такая.

Вложенные категории создаются просто. Делается таблица со столбцами "категория" и "родитель" (родительская категория). При выборке с указанием конкретного родителя вы получите все подкатегории для указанной. А для корневых категорий просто используется некое особое значение (пустая ячейка, NULL, -1 и т.п.)

Структура реляционных БД, обычно, сама по себе не отображает объектной модели того, что в ней содержится. Связи получаются косвенными. Реальную структуру, обычно, отображают ORM (объектная модель на каком-то языке программирования, набор классов, полей и методов, отображающий взаимодействия объектов, содержащихся в БД). ORM не является обязательной при разработке. Если разработчик знает структуру БД, то может реализовать все нужные запросы напрямую.

Автор: Truniger 25.4.2013, 11:09
Цитата(Arantir @ 24.4.2013,  23:10)

Структура реляционных БД, обычно, сама по себе не отображает объектной модели того, что в ней содержится. Связи получаются косвенными. Реальную структуру, обычно, отображают ORM (объектная модель на каком-то языке программирования, набор классов, полей и методов, отображающий взаимодействия объектов, содержащихся в БД).

То есть я так понял ORM это какое дополнительное ПО которое упрощает работу с БД?

Автор: Arantir 25.4.2013, 12:35
ORM — это просто представление БД в виде классов (как если бы данные из БД были объектами в вашей программе). 
Встроенные возможности формирования запросов у существующих ORM-библиотек ограничены. Реляционность БД позволяет осуществить многие действия намного эффективнее, чем это бы делалось с объектной точки зрения.
Зачастую разработчик сам реализует некоторое запросы.
ORM — только обертка. Распространенный прием в ООП. Вы просто инкапсулируете некие операции в классе (наборе классов). Программа теперь может пользоваться этими классами и ей абсолютно все равно, что именно у них внутри.

Но лучше сразу в ORM не вдавайтесь. Разберитесь с созданием БД в mysql. На самом деле это довольно просто. Я привел ORM просто как пример, а не как совет того, с чего стоит начинать.

Я чего вообще про ORM... Вот Вы написали 
Цитата(Truniger @  24.4.2013,  21:41 Найти цитируемый пост)
Получается, что в ячейке таблицы должна быть новая таблица.
Это верно с объектной точки зрения. У вас есть класс Категория и в нем есть поле подкатегории. И в этом поле содержатся объекты того же класса Категория.
Но при создании реляционной структуры БД надо делать акцент на отношениях между объектами. 
Ход мыслей примерно такой:
Категории — просто объекты. Можно просто сделать таблицу с (id, имя_категории).
Подкатеории связаны с категорией тем, какая категория для подкатегории есть родительской. Можно сделать таблицу (id, родитель, имя_категории).
И катеории и подкатегории по сути являются одинаковыми объектами. Просто у категорий нет родителей, а у подкатегорий есть. Значит можно сделать одну таблицу (id, родитель, имя_категории) и просто не указывать родителя корневым категориям.

Автор: Truniger 25.4.2013, 12:50
Цитата(Arantir @ 25.4.2013,  12:35)

Категории — просто объекты. Можно просто сделать таблицу с (id, имя_категории).
Подкатеории связаны с категорией тем, какая категория для подкатегории есть родительской. Можно сделать таблицу (id, родитель, имя_категории).
И катеории и подкатегории по сути являются одинаковыми объектами. Просто у категорий нет родителей, а у подкатегорий есть. Значит можно сделать одну таблицу (id, родитель, имя_категории) и просто не указывать родителя корневым категориям.


А, вот теперь я кажется вас понял, то есть в БД что категории что подкатегории являются одинаковыми объектами - таблицами, а каталог это просто грамотно выстроенные "взаимоотношения" между ними? 

Ну теперь конечно надо это реализовать, с моим знанием языка это будет трудновато, но нечего,  главное смысл я уловил, большое спасибо smile .

Автор: Arantir 25.4.2013, 14:09
Цитата(Truniger @  25.4.2013,  11:50 Найти цитируемый пост)
то есть в БД что категории что подкатегории являются одинаковыми объектами - таблицами

Таблицы представляют совокупность объектов. Если проводить параллели: таблица — как класс, имена столбцов — имена полей класса, строки таблицы — объекты класса с соответствующими значениями.

Цитата(Truniger @  25.4.2013,  11:50 Найти цитируемый пост)
а каталог это просто грамотно выстроенные "взаимоотношения" между ними? 

В принципе — да. "Реляционный" и исходит от англ. relation (отношение, связь).

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)