Для работы блога нам нужна база данных. В этой книге мы используем систему управления базами данных MySQL, которая очень проста в установке и администрировании.
За инструкциями по установке сервера и клиента MySQL для различных ОС обратитесь к Приложению А. Настройка среды веб-разработки.
После установки MySQL наберите следующую команду в командной оболочке для входа в консольный клиент MySQL.
mysql -u root -p
При запросе пароля, введите пароль пользователя root (вы указали его в процессе установки MySQL-сервера). При успешной авторизации вы увидите следующее сообщение:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.13-0ubuntu0.16.04.2 (Ubuntu)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Теперь вы можете набирать команды клиента MySQL (show databases
, show tables
и др.) или
SQL-запросы (например, SELECT
или INSERT
) в командной строке и видеть их результат.
Для выхода из командной строки MySQL, наберите
quit
и нажмите Enter.
Теперь двайте создадим базу данных и назовем ее blog
. Для этого наберите следующий оператор SQL
и нажмите Enter:
CREATE DATABASE blog;
Ожидаемый результат этой команды такой:
Query OK, 1 row affected (0.01 sec)
Команды MySQL нечувствительны к регистру, так что с тем же результатом можно было набрать
create database blog;
. Мы рекомендуем использовать верхний регистр для SQL-запросов, так как это является стандартом оформления.
Далее, создадим пользователя с именем blog
и зададим ему все привилегии для доступа к базе данных
blog
и внесения изменений в нее и все ее таблицы:
GRANT ALL PRIVILEGES ON blog.* TO blog@localhost IDENTIFIED BY '<passwd>';
В команде выше замените плейсхолдер паролем для пользователя blog
. Этот пароль должен
отличаться от пароля для пользователя root.
Мы создаем нового пользователя
blog
, так как для веб-приложения не рекомендуется входить в базу данных под пользователемroot
. Пользователь root имеет неограниченные права, и было бы просто небезопасно предоставлять приложению возможность совершать любые действия. У пользователяblog
будут права только на изменение базы данныхblog
, чего в нашем случае достаточно.
Созданную базу данных можно проверить, набрав следующую команду и нажав Enter:
show databases;
Вы должны будете увидеть такой результат (обратите внимание на строку blog
в списке баз данных):
+--------------------+
| Database |
+--------------------+
| information_schema |
| blog |
| mysql |
| performance_schema |
+--------------------+
Далее, мы создадим три таблицы, типичные для любого простого блога: таблицу post
, содержащую
посты, таблицу comment
, содержащую комментарии к ним и таблицу tag
, содержащую теги (тег является
своего рода ключом, описывающим пост блога).
Кроме этого, мы создадим вспомогательную четвертую таблицу post_tag
, которая будет использоваться
для создания отношения «многие-ко-многим» между таблицами post
и tag
.
Сделаем базу данных blog
текущей, набрав из командной строки MySQL следующее:
use blog;
Чтобы создать таблицу post
, наберите следующий оператор SQL:
CREATE TABLE `post` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`title` text NOT NULL,
`content` text NOT NULL,
`status` int(11) NOT NULL,
`date_created` datetime NOT NULL
);
Клиент MySQL позволяет легко вводить многострочные команды. Для перевода каретки на новую строку просто нажмите Enter. Команда считается введенной при встрече с символом «точка с запятой» (;).
Ожидаемый результат этой команды:
Query OK, 0 rows affected (0.22 sec)
Теперь создадим таблицу comment
следующим образом:
CREATE TABLE `comment` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`content` text NOT NULL,
`author` varchar(128) NOT NULL,
`date_created` datetime NOT NULL
);
После этого создадим таблицу tag
:
CREATE TABLE `tag` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(128)
);
И наконец, создадим таблицу post_tag
:
CREATE TABLE `post_tag` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL
);
Давайте заполним созданные нами таблицы примерами данных:
INSERT INTO tag(`name`) VALUES('ZF3');
INSERT INTO tag(`name`) VALUES('book');
INSERT INTO tag(`name`) VALUES('magento');
INSERT INTO tag(`name`) VALUES('bootstrap');
INSERT INTO post(`title`, `content`, `status`, `date_created`) VALUES(
'A Free Book about Zend Framework',
'I''m pleased to announce that now you can read my new book "Using Zend Framework 3" absolutely for free! Moreover, the book is an open-source project hosted on GitHub, so you are encouraged to contribute.',
2, '2016-08-09 18:49');
INSERT INTO post(`title`, `content`, `status`, `date_created`) VALUES(
'Getting Started with Magento Extension Development - Book Review',
'Recently, I needed some good resource to start learning Magento e-Commerce system for one of my current web projects. For this project, I was required to write an extension module that would implement a customer-specific payment method.',
2, '2016-08-10 18:51');
INSERT INTO post(`title`, `content`, `status`, `date_created`) VALUES(
'Twitter Bootstrap - Making a Professionaly Looking Site',
'Twitter Bootstrap (shortly, Bootstrap) is a popular CSS framework allowing to make your website professionally looking and visually appealing, even if you don''t have advanced designer skills.',
2, '2016-08-11 13:01');
INSERT INTO post_tag(`post_id`, `tag_id`) VALUES(1, 1);
INSERT INTO post_tag(`post_id`, `tag_id`) VALUES(1, 2);
INSERT INTO post_tag(`post_id`, `tag_id`) VALUES(2, 2);
INSERT INTO post_tag(`post_id`, `tag_id`) VALUES(2, 3);
INSERT INTO post_tag(`post_id`, `tag_id`) VALUES(3, 4);
INSERT INTO comment(`post_id`, `content`, `author`, `date_created`) VALUES(
1, 'Excellent post!', 'Oleg Krivtsov', '2016-08-09 19:20');
При необходимости базу данных вместе со всеми ее таблицами и данными легко можно удалить, набрав следующую команду из консоли MySQL:
DROP DATABASE blog;
Рисунок 12.3 графически иллюстрирует сущности нашей базы данных и отношения между ними.
Рисунок 12.3. Графическое представление схемы базы данных
Как видите из рисунка, таблицы post
и comment
имеют связь один-ко-многим, так как у одного
поста может быть несколько комментариев. Это также называется отношением «один-ко-многим».
Таблицы post
и tag
имеют связь многие-ко-многим. У одного поста может быть много тегов,
а один тег, в свою очередь, может принадлежать нескольким постам. Отношение «многие-ко-многим»,
как правило, реализуется через вспомогательную таблицу (в нашем случае это таблица post_tag
).
В предыдущем разделе мы показали, как создать схему базы данных, которая используется в
приложении Blog. В реальной жизни вы, как правило, не будете набирать все эти операторы
SQL в командную строку MySQL. Вместо этого можно просто записать операторы CREATE TABLE
в файл и сохранить его на диск. Затем вы можете просто импортировать этот файл, и у вас
будет готовая схема.
Для вашего удобства, готовая схема для примера Blog находится в файле APP_DIR/data/schema.mysql.sql. Это обычный текстовый файл, содержащий операторы SQL. Для его импорта перейдите в каталог APP_DIR/data/ и наберите в командной оболочке следующую команду (не в командной строке MySQL):
mysql -u root -p blog < schema.mysql.sql
При запросе пароля, наберите пароль пользователя root и нажмите Enter.
После этого войдите в клиент MySQL и наберите следующие команды:
use blog;
show tables;
Вы должны будете увидеть список созданных таблиц, подобный этому:
+----------------+
| Tables_in_blog |
+----------------+
| comment |
| post |
| post_tag |
| tag |
+----------------+
4 rows in set (0.00 sec)
Кроме того, рассмотрите использование миграций базы данных для инициализации схемы базы данных. Обратитесь к главе Миграции баз данных за дополнительной информацией о миграциях.