Когда рабочее окружение установлено и настроено ничего не мешает приниматься за работу. Сначала я решил спроектировать базу данных. Пожалуй это одна из самых сложных задач для меня. Но ведь глаза боятся а руки делают. Здесь нужно максимально учесть всё, что мне понадобится. В идеале нужно учесть вообще всё. Но я ведь только ученик. Поэтому крепко подумаю и сделаю как смогу.
Открываю phpmyadmin и создаю новую базу данных. Назову её так же как и своё приложение PuzzleChessCms. Выбираю кодировку utf8 и нажимаю кнопку Создать.
База данных создана, теперь создаю первую таблицу. Это будет таблица cms_route. В ней будут храниться правила для загрузки модулей например blog или cpanel. Нажимаю «Вперёд».
В таблице будет 4 столбца. Все кроме id будут иметь тип VARCHAR и ограничение по длине 25 символов. id ставлю тип SERIAL, индекс PRIMARY, AUTO_INCREMENT. Заполняю и нажимаю сохранить.
3. action — Функция которая должна загружаться по умолчанию.Теперь чуть подробнее о назначении каждого столбца:
1. id — уникальный идентификатор роута
2. route — здесь будет храниться чать URL приложения. Например /blog
2. app — модуль который должен загрузиться.
По моей задумке такой подход позволит мне проявить гибкость при загрузке модулей программы. Например если указать в route «admin» а в app «cpanel». Тогда по ссылке www.mysyte.net/admin класс Route должен будет загрузить модуль cpanel.
3. setting_value — varchar(256)Следующая таблица cms_setting. Здесь будет 3 столбца. По сути это будет архив ключ=>значение с различными настройками CMS.
1. id —
2. setting_key — varchar(256)
4. user_password varchar(256)Теперь создам таблицу пользователей.
1. id
2. user_login varchar(25)
3. user_email varchar(50)
В отдельной таблице user_sessions буду хранить данные о сессиях пользователей
- id
- user_id — Иденификатор пользователя
- session_hash — хеш создаваемый с каждым новым входом пользователя и хранящийся в куке
- session_agent — информация о браузере пользователя
Всё вместе это даст мне возможность сделать более удобную систему авторизации. И избавит пользователя от ввода пароля при кажом посещении сайта.
Так же мне нужно подумать где хранить личные настройки пользователей. Пойду по проторенному пути и создам таблицу user_setting.
- id
- user_id
- setting_key
- setting_value
Хорошо, теперь пора подумать где хранить страницы модуля сайт. Тут не должно быть сложно, так как они все статические и нужно просто хранить текст. Однако в тех. задании я писал, что должно быть 2 вида сраниц, обычные и лендинги. Получилась таблица pages
- id
- pid — На случай если страница может иметь «подстраницу», например с дополнительной информацией
- page_type — Этому полю я присвоил тип ENUM. Здесь хранится тип страницы page или promo
- page_url — уникальная ссылка на страницу
- page_title — то, что должно попасть в тег <title></title>
- page_text — основной текст страницы
- page_author — Пользователь который страницу опубликовал
Перезожу к таблицам для блога. Здесь пожалуй будет посложнее. Нужна таблица в которой будут храниться посты, таблица с комментариями и как-то нужно организовать систему тегов.
Начну с таблицы blog_posts
- id
- post_url
- post_title
- post_anons — небольшой анонс поста
- post_text
- post_author
- date_publication — дата публикации поста
- date_modification — дата последнего изменения
- post_status ENUM(‘published’,’draft’,’deleted’)
Таблица post_comments
- id
- post_id
- user_id
- comment_text
- comment_status
Таблица tags простаяДля организации системы тегов я создал 2 таблицы.
- id
- pid
- tags_name
Столбец pid позволит мне делать вложенные теги, что может быть удобно для группировки постов по темам и подтемам.
И для связей тегов с постами блога или страницами сайта делаю ещё одну таблицу tags_object
- tag_id — идентификатор тега
- object_id — идентификатор объекта с которым связан тег, это может быть пост в блоге или страница на сайте.
- object_type — Тип объекта с которым связан тег. Для избежания коллизий с одинаковыми object_id
Таким образом я создал все основные таблицы и посторался учесть всё что мне понадобится и даже некоторую возможность расширения функционала в дальнейшем. Получилось вроде не плохо для моего текущего уровня. Посмотрим каково теперь под всё это писать код.
Продолжение следует…