Структура Базы Данных
Атом
Атом - в нашей 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.