Структура базы данных


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

Русская кухня

Кавказская кухня


Таблица для разделов

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

Таблица section

Имя поля Тип Описание
section_id tinyint(3) unsigned Идентификатор раздела
section_pid tinyint(3) unsigned Идентификатор родительского раздела
section_title varchar(60) Заголовок раздела
section_description text Описание раздела

Поле section_id является уникальным и предназначено для задания идентификатора раздела. Это поле следует определить в качестве первичного индекса, делается это для того, чтобы данные однозначно указывали на требуемые разделы и работа с ними происходила быстрее. Значением поля является целое положительное число от 1 до 255, больше разделов на сайте вряд ли понадобится. Можно было назвать поле просто id, но еще предстоит связывать данные разных таблиц, а в них также будут идентификаторы. Чтобы не запутаться, в имя поля лучше добавить название таблицы или другое ключевое слово.

В поле section_pid содержится значение идентификатора раздела, которое является родителем для раздела текущего. Родителем называется раздел верхнего уровня, так, для раздела «Закуски» его родителем будет раздел «Русская кухня». Если родитель отсутствует, значение поля следует приравнять нулю. Пример заполнения таблицы данными показан ниже.

Записи таблицы section

section_id section_pid section_title
1 0 Русская кухня
2 1 Закуски
3 1 Первые блюда
4 1 Вторые блюда
5 0 Кавказская кухня
6 5 Первые блюда
7 5 Вторые блюда

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

section_description — значение поля используется в нескольких целях: для описания страницы с помощью метатега Description и для краткой информации, что в данном разделе содержится. Для этого поля используется тип text, который позволяет хранить до 65535 символов, что вполне достаточно для создания подробного описания.

SQL-запрос, генерирующий таблицу section, приведен в примере 1.

Пример 1. Создание таблицы section
CREATE TABLE section (
section_id tinyint(3) unsigned NOT NULL auto_increment,
section_pid tinyint(3) unsigned NOT NULL default "0",
section_title varchar(60) NOT NULL,
section_description text,
PRIMARY KEY (section_id)
) TYPE=MyISAM

Сам SQL-запрос можно выполнить через систему phpMyAdmin (для тех, кто установил комплект Денвер, адрес на локальном компьютере http://localhost/phpMyAdmin/index.php). На рис. 1. показана закладка SQL, которую следует выбрать и ввести текст примера. После чего необходимая таблица будет создана автоматически.

Рис. 1. Выполнение SQL-запросов в системе phpMyAdmin

Рис. 1. Выполнение SQL-запросов в системе phpMyAdmin


Используемые в запросе примера 1 параметры.
TINYINT — целое число, может изменять значение от -127 до 127. Тип TINYINT unsigned указывает, что значение будет положительным числом и меняться в пределах от 0 до 255. В скобках указывается ширина поля.
auto_increment — автоинкрементирование, другими словами, автоматическое увеличение значения на единицу.
NOT NULL — означает, что поле не может содержать пустое значение.
PRIMARY KEY ('section_id') — устанавливает первичный ключ для поля section_id.


Таблица для контента

Вторая основная таблица предназначена для хранения самого содержания, так называемого контента, так ее и назовем — content.

Таблица content

Имя поля Тип Описание
content_id smallint(5) unsigned Идентификатор статьи
section_id tinyint(3) unsigned Идентификатор раздела, куда входит статья
content_title varchar(60) Заголовок статьи
content_keywords varchar(255) Ключевые слова
content_description text Описание статьи
content_author varchar(50) Автор статьи
content_published date Дата публикации
content_update date Дата последнего обновления
count_total smallint(5) Общее количество человек, прочитавших статью
count_today smallint(5) Количество человек, прочитавших статью сегодня
today date Сегодняшняя дата

Поле content_id является ключевым и однозначно определяет каждую статью по ее номеру. Поскольку статей может быть гораздо больше, чем разделов, ведь каждый раздел содержит сразу несколько статей, используется тип данных smallint. Положительные значения элементов в этом случае могут быть от 0 до 65535, вполне солидное значение для любого сайта.

section_id — номер раздела, его значение берется из таблицы section. Это поле является связующим между двумя таблицами, поэтому тип и формат записи должны совпадать в обеих таблицах.

С названием статьи и ее описанием все понятно, поэтому обратимся к ключевым словам (content_keywords). Это поле используется поисковыми системами для гибкого поиска информации и повышения рейтинга страницы. Строка больше 255 символов, которая отводится для этого текста, обычно не требуется, поисковики сами обрезают чересчур длинные строки.


Счетчики посетителей нужны для информации, эти данные можно публиковать на странице или не делать этого, а использовать для своих нужд. В любом случае, будет полезно знать, сколько людей читают ту или иную статью для создания их рейтинга или анализа популярности материалов. Чтобы определить, сколько человек прочитало статью сегодня, требуется хранить сегодняшнюю дату, дабы обнулять счетчик count_today. Для этого и вводится дополнительное поле today.

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

SQL-запрос, генерирующий таблицу content, приведен в примере 2.

Пример 2. Создание таблицы content
CREATE TABLE content (
content_id smallint(5) unsigned NOT NULL auto_increment,
section_id tinyint(3) unsigned NOT NULL default "0",
content_title varchar(60) NOT NULL,
content_keywords varchar(255),
content_author varchar(50),
content_published date,
content_update date,
content_text text,
count_total smallint(5) unsigned,
count_today smallint(5) unsigned,
today date,
PRIMARY KEY (content_id)
) TYPE=MyISAM

Тип данных smallint unsigned, который участвует в запросе, предназначен для хранения целых чисел от 0 до 65535.


Связывание данных

Напрямую, аналогично СУБД Access, установить отношения между таблицами нельзя. Так что связи между полями, в которых содержится общая информация, устанавливаются через запросы. Совсем не обязательно, чтобы эти поля имели одинаковое имя, важно, что информация, тип данных и длина поля в записях совпадали. На рис. 2 и 3 приведены используемые таблицы с указанным типом и размером полей, а на рис. 4 показано связывание таблиц по полю section_id. Цветным ромбом отмечены ключевые поля.

Рис. 2. Таблица section

Рис. 2. Таблица section

Рис. 3. Таблица content

Рис. 3. Таблица content

Рис. 4. Связывание данных

Рис. 4. Связывание данных

На рис. 4. показан пример работы конструктора запросов, при котором два поля оказываются связанными и данные извлекаются сразу из двух таблиц.

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


Замечания



Предыдущая статья     Следующая статья     Список статей