Структура Базы Данных

Атом

Атом - в нашей CMS это термин будет обозначает минимальный не делимый,  логически завершенный объем информации.  Это можно понимать как маленькие информационные кирпичики из которых будет строится весь сайт. Например: пост или страница - это  атомы, категория, тег(метка) - и это атомы, комментарий к посту - тоже атом и даже пользователь зарегистрированный на сайте получает свой кусочек информации и это тоже атом. Весь сайт состоит из атомов - простейших информационных частиц. 

Таблица atoms

CREATE TABLE `bu_atoms` (
  `a_id` int(10) UNSIGNED NOT NULL,
  `a_insert` datetime NOT NULL,
  `a_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `a_type` char(16) NOT NULL,
  `a_status` char(16) DEFAULT NULL,
  `a_name` char(64) DEFAULT NULL,
  `a_title` char(128) DEFAULT NULL,
  `a_note` char(255) DEFAULT NULL,
  `a_count` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

  • a_id это поле авто-инкремента и первичный ключ таблицы.
  • a_insert, a_update - дата создания , дата обновления, обязательные поля
  • a_type тип атома может быть post, page, category, tag, comment, user ... ваш собственный тип
  • a_status   -  статус атома то есть показывает видимость или уровень доступа к атому например: public, draft, private, trash. *тут пока в процессе разработке обрабатывается только статус trash когда атом в мусорной корзине но еще не удален

Далее идут поля необязательные a_name, a_title, a_note- имя, заголовок, краткое описание.  И последнее совсем необязательное  a_count -  количество дочерних объектов у атома.  

В таблицу можно добавить свои поля, но запрещено добавлять текстовые поля (text, это сильно затормаживает SQL запросы к таблице!  Если вы изменили таблицу добавили свои поля - необходимо откорректировать в файле config.php переменную $buTables  привести ее в соответствие.  Не стоит добавлять сюда все подряд перегружать таблицу, лишними колонками, здесь должно быть только самое необходимое,  все остальные поля выносим в таблицу metas.  Чтобы понять насколько поле необходимо предлагаю руководствоваться следующим правилом -  вот есть у нас  короткий вид отображения постов (posts) , это когда выдается  пользователю список в категории на главной или по метке.    Так вот для отображения короткого вида нам нужна дата обновления a_updatea, заголовок  a_title,  короткая аннотация a_note,  и если использовать ЧПУ то поле a_name - имя поста на латинице.  Вот эти поля и должны быть в таблице atoms. 

Второй критерий для добавления поля в таблицу это когда мы организуем поиск по полю ну например при создании магазина создаем поле цена a_price и количество товара на складе a_count далее при поиске на сайте по этим критериям нам нужна будет только таблица атомов не нужно присоединять таблицу мета.

Все поля в этой таблице должны иметь префикс a_ 

Таблица metas

CREATE TABLE `bu_metas` (
  `m_id` int(10) UNSIGNED NOT NULL,
  `m_a_id` int(10) UNSIGNED NOT NULL,
  `m_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `m_name` char(32) NOT NULL,
  `m_number` int(11) DEFAULT NULL,
  `m_string` varchar(255) DEFAULT NULL,
  `m_text` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Эта таблица связана с таблицей atoms связью один ко многим.  То есть на один атом может приходится множество мета полей.  В мета  мы хранятся все данные атома, что не вошли в таблицу atoms включая большие текстовые поля. 

  • m_id - уникальный идентификатор мета поля,  первичный ключ, авто-инкремент 
  • m_a_id - это id атома родителя к которому привязано мета поле
  • m_update - дата обновления поля
  • m_name - имя поля 
  • m_number , m_string, m_text  а вот тут будут хранится сами данные - значение поля, в зависимости от того какой тип представляют эти данные будут автоматически распределены в один из 3 столбцов: m_number - для хранения простых чисел включая отрицательные, m_string - строка до 256 знаков, m_text - текстовые поля

Распределение по типу данных происходит прозрачно для пользователя главное пользоваться API предоставляемым CMS. 

Таблица links

  Таблица связей - хранит связи между атомами. 

CREATE TABLE `bu_links` (
  `l_id` int(10) UNSIGNED NOT NULL,
  `l_parent` int(10) UNSIGNED NOT NULL,
  `l_child` int(10) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • l_id - уникальный идентификатор связи целое число, поле авто-инкремента, первичный ключ
  • l_parent - идентификатор родителя a_id 
  • l_child   - идентификатор ребенка (потомок) a_id

Через таблицу связей мы можем связывать любые атомы друг с другом единственное ограничение нельзя связать 2 атома прямой и обратной связью такая коллизия будет отслежена и связь перезаписана.   Например у нас в таблице была связь атом родитель с a_id:34    связан с атомом потомком a_id:78  , а мы пытаемся добавить в таблицу связь обратную 78 -> 34  такая попытка приведет перезаписи и в таблице останется только 78->34.