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

Открываю phpmyadmin и создаю новую базу данных. Назову её так же как и своё приложение PuzzleChessCms. Выбираю кодировку utf8 и нажимаю кнопку Создать.

База данных создана, теперь создаю первую таблицу. Это будет таблица cms_route. В ней будут храниться правила для загрузки модулей например blog или cpanel. Нажимаю «Вперёд».

В таблице будет 4 столбца. Все кроме id будут иметь тип VARCHAR и ограничение по длине 25 символов. id ставлю тип SERIAL, индекс PRIMARY, AUTO_INCREMENT. Заполняю и нажимаю сохранить.

Теперь чуть подробнее о назначении каждого столбца:
1. id — уникальный идентификатор роута
2. route — здесь будет храниться чать URL приложения. Например /blog
2. app — модуль который должен загрузиться.
3. action — Функция которая должна загружаться по умолчанию.

По моей задумке такой подход позволит мне проявить гибкость при загрузке модулей программы. Например если указать в route «admin» а в app «cpanel». Тогда по ссылке www.mysyte.net/admin класс Route должен будет загрузить модуль cpanel.

Следующая таблица cms_setting. Здесь будет 3 столбца. По сути это будет архив ключ=>значение с различными настройками CMS.
1. id
2. setting_key — varchar(256)
3. setting_value — varchar(256)

Теперь создам таблицу пользователей.
1. id
2. user_login varchar(25)
3. user_email varchar(50)
4. user_password varchar(256)

В отдельной таблице user_sessions буду хранить данные о сессиях пользователей

  1. id
  2. user_id — Иденификатор пользователя
  3. session_hash — хеш создаваемый с каждым новым входом пользователя и хранящийся в куке
  4. session_agent — информация о браузере пользователя
    Всё вместе это даст мне возможность сделать более удобную систему авторизации. И избавит пользователя от ввода пароля при кажом посещении сайта.

Так же мне нужно подумать где хранить личные настройки пользователей. Пойду по проторенному пути и создам таблицу user_setting.

  1. id
  2. user_id
  3. setting_key
  4. setting_value

Хорошо, теперь пора подумать где хранить страницы модуля сайт. Тут не должно быть сложно, так как они все статические и нужно просто хранить текст. Однако в тех. задании я писал, что должно быть 2 вида сраниц, обычные и лендинги. Получилась таблица pages

  1. id
  2. pid — На случай если страница может иметь «подстраницу», например с дополнительной информацией
  3. page_type — Этому полю я присвоил тип ENUM. Здесь хранится тип страницы page или promo
  4. page_url — уникальная ссылка на страницу
  5. page_title — то, что должно попасть в тег <title></title>
  6. page_text — основной текст страницы
  7. page_author — Пользователь который страницу опубликовал

Перезожу к таблицам для блога. Здесь пожалуй будет посложнее. Нужна таблица в которой будут храниться посты, таблица с комментариями и как-то нужно организовать систему тегов.

Начну с таблицы blog_posts

  1. id
  2. post_url
  3. post_title
  4. post_anons — небольшой анонс поста
  5. post_text
  6. post_author
  7. date_publication — дата публикации поста
  8. date_modification — дата последнего изменения
  9. post_status ENUM(‘published’,’draft’,’deleted’)

Таблица post_comments

  1. id
  2. post_id
  3. user_id
  4. comment_text
  5. comment_status

Для организации системы тегов я создал 2 таблицы.
Таблица tags простая

  1. id
  2. pid
  3. tags_name

Столбец pid позволит мне делать вложенные теги, что может быть удобно для группировки постов по темам и подтемам.

И для связей тегов с постами блога или страницами сайта делаю ещё одну таблицу tags_object

  1. tag_id — идентификатор тега
  2. object_id — идентификатор объекта с которым связан тег, это может быть пост в блоге или страница на сайте.
  3. object_type — Тип объекта с которым связан тег. Для избежания коллизий с одинаковыми object_id

Таким образом я создал все основные таблицы и посторался учесть всё что мне понадобится и даже некоторую возможность расширения функционала в дальнейшем. Получилось вроде не плохо для моего текущего уровня. Посмотрим каково теперь под всё это писать код.

Продолжение следует…