среда, 9 января 2019 г.

Азбука MySQL

Азбука MySQL

Автор: Николай Шляхтун (Издательский Дом "КОМИЗДАТ")
Причина возникновения названия MySQL остается неясной. С одной стороны, разработчики в процессе написания программ ко многим директориям и именам файлов традиционно добавляли префикс "my". С другой стороны, имя дочери одного из разработчиков - My. Какой из этих фактов стал причиной такого названия, остается загадкой даже для разработчиков.
Как только мы задумываемся об упорядоченном хранении информации, неизбежно приходим к мысли о создании базы данных. Создав ее, например, в Microsoft Access, мы облегченно вздыхаем и на какое-то время успокаиваемся. Но это "какое-то время" длится недолго - на горизонте уже маячит следующая, продиктованная жизненной необходимостью задача: нужно обеспечить доступ к данным через интернет с рабочих станций, на которых, вполне возможно, установлены различные ОС. И вот тут на помощь приходит быстрая и надежная СУБД MySQL.
Эта СУБД ведет свое начало от mSQL. Разработчики нуждались в более быстрой, надежной и гибкой СУБД. В результате был создан новый SQL-интерфейс при почти не измененном API-интерфейс mSQL. Этот API был выбран, чтобы облегчить перенос программ других разработчиков.

Вся мощь простоты

SQL - это язык структурированных запросов (Structured Query Language), международный стандарт языка для доступа к базам данных.
MySQL - это, если смотреть в общем, SQL-сервер; иначе говоря - программа, которая принимает запросы, написанные на SQL, и отсылает обратно определенные ответы. Ответами могут быть: данные, количество строк, задействованных в запросе, или просто строка (например, "Привет, Мир!").
СУБД MySQL предоставляет в ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.
Конечно, нам нужно как-то обеспечить доступ к MySQL. Это можно сделать или через клиент (как текстовый, так и графический), или через какой-то язык программирования.
Ядро, на котором сформирован MySQL, представляет собой набор подпрограмм, которые уже много лет использовались в высокотребовательном окружении. Это богатый и полезный функциональный набор, в то время как MySQL все еще находится в разработке.
Основные цели MySQL: быстродействие и ошибкоустойчивость. Эта СУБД прекрасно справляется с обработкой очень значительных массивов данных (большое количество пользователей сообщают о работе с тысячами и даже миллионами записей). В листах рассылок нередки сообщения об базах данных в несколько гигабайт. Кроме того, MySQL в запросах к большим таблицам превосходит многие другие системы. Она очень стабильна и превосходно работает даже в случаях, когда несколько сотен пользователей нуждаются в доступе к одним и тем же данным. Исходя из вышесказанного легко понять, почему MySQL пользуется такой популярностью у разработчиков веб-приложений. MySQL также очень масштабируема, работает на всем - от персональных компьютеров до больших многопроцессорных систем.
Одно из замечательных свойств MySQL заключается в том, что пользователь имеет доступ к MySQL-серверу независимо от операционной системы, языка программирования или клиента, которым пользуется. Находясь на UNIX-системе, пользователь может связываться с MySQL-сервером, работающим на OS/2- и Windows-платформах.
Для взаимодействия с MySQL-сервером можно использовать множество языков программирования. Можно написать программы на C, C++, Java, PHP, Perl, TCL, Python - и они будут работать.
В MySQL все организовано по схеме "ничего лишнего", поэтому и отсутствуют некоторые функции, которыми оснащены другие базы данных. MySQL не поддерживает вложенных запросов, тригерров; отсутствует также встроенная поддержка XML, OLAP и конструктов (constraits). Но зато есть новации (например, возможность кешировать запросы). Отсутствующие функции были принесены в жертву быстродействию, которое обеспечивает эта СУБД (хотя, если какие-то из этих функций все же понадобятся, можно использовать разработками сторонних производителей).

Как поставил, так и держится

Теперь, когда мы увидели, каким "навороченным" продуктом является MySQL, тем более хочется попробовать его в деле, поставить и пощупать все своими руками. Этим и займемся.
В связи с возрастающим интересом к Linux-платформам, рассмотрим установку и работу с MySQL именно на такой платформе. Чтобы инсталляция MySQL проходила без особых затруднений, будем следовать рекомендациям, выложенным на сайте MySQL.
  • Первое, что нам рекомендуют,- скачать стабильную (stable release) версию (на момент написания статьи - MySQL 3.23.49a).
  • Второй совет: не пытаться скомпилировать MySQL самостоятельно - устанавливать уже скомпилированную версию.
Приняв на вооружение эти рекомендации, запускаем на закачку файл "mysql-3.23.49a-pc-linux-gnu-i686.tar.gz" и спустя некоторое время получаем его. Перед началом установки создадим у себя группу и пользователя mysql:
Shell>groupadd mysql  Shell> useradd -g mysql mysql  
Далее распаковываем этот файл в каталог /usr/local:
Shell> tar -zxf gunzip mysql-3.23.49a-pc-linux-gnu-i686.tar.gz
Затем нужно сделать символическую ссылку mysql с каталога mysql-3.23.49a-pc-linux-gnu-i686:
Shell> ln -s mysql-3.23.49a-pc-linux-gnu-i686 mysql
Причина этих действий заключается в том, что в скриптах прописаны именно эти каталоги.
Теперь создадим каталог, в котором будут хранится базы. Для этого нужно всего лишь зайти в каталог mysql и запустить скрипт mysql_install_db, который находится в каталоге scripts:
Shell>cd /usr/local/mysql  Shell>scripts/mysql_install_db  
И последний штрих: с помощью команды safe_mysqld, которая находится в каталоге bin, запускаем сервер. Если очень хочется, чтобы запуск происходил при каждой загрузке системы, надо поместить запуск safe_mysql в один из файлов инициализации системы.
В качестве примера: дописываем в /etc/rc.d/rc.local строчку /usr/local/mysql/bin/safe_mysqld &. Но, если просто записать эту строку в rc.local, mysql не захочет запускаться при загрузке системы. И вот, пошаманив немного над файлом safe_mysqld, я обнаружил, что в некоторых местах нужно заменить libexec на bin и var на data. Вот строки (начиная с 87), которые подверглись изменениям:
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
DATADIR=$MY_BASEDIR_VERSION/data
else
MY_BASEDIR_VERSION=/usr/local/mysql
DATADIR=/usr/local/mysql/data
ledir=/usr/local/mysql/bin
После того как мы все поставили, нужно изменить владельца и группу созданных каталогов.
Каталогу mysql и всем подкаталогам нужно назначить владельца root и группу mysql.
Shell>chown -R root:mysql /usr/local/mysql  
Каталогу баз данных назначаем владельца mysql и одноименную группу.
Shell>chown -R mysql:mysql /usr/local/mysql/data  
И последний штрих в настройке - пропишем путь к исполняемым программам mysql в profile:
PATH=$PATH:/usr/local/mysql/bin  
На сайте mysql можно скачать графические оболочки для работы с базами (mysqlgui и mycc). Только вот, установив эти оболочки, я пришел к выводу, что они не заменяют знание SQL и удобны только для отображения таблиц, находящихся в базе (кстати, для отображения мне больше понравился mycc - у него понятнее интерфейс, и с ним легче работать).
Для связи с базой данных предназначена программа mysql. Это командный интерпретатор, который передает введенные команды СУБД.

Что б такого сотворить

В качестве примера работы с этой системой управления базами данных создадим базу аудиодисков. Думаю, найдется немало любителей музыки, владеющих такой массой музыкальных дисков, что в ней можно запутаться. Кроме того, еще одна проблема возникает, когда даешь кому-то послушать диск. Диск слушают, а возвращать забывают (да и сам нередко забываешь, кому что дал). Вот и получается: что диск у тебя был, помнишь, а где он сейчас - без понятия.
Итак, мы поняли, что нужно сделать; приступим к исполнению.
Для начала создадим базу данных. Запускаем командный интерпретатор и набираем:
Mysql> create database audio_cd;  
Теперь самое время подумать, из чего же будет состоять наша база. Иначе говоря, какие таблицы она будет в себя включать.

Создадим таблицу дисков, которая будет включать в себя 3 поля:
  • уникальный номер диска;
  • название диска;
  • год выпуска диска.

Следующая таблица - это таблица песен:
  • уникальный номер песни
  • название песни
  • исполнитель
  • описание, или жанр

Третья таблица, которую мы создадим, это таблица друзей:
  • уникальный номер;
  • имя;
  • адрес;
  • телефон;
  • адрес электронной почты.
Естественно, что на диске может быть больше одной песни, и что одна песня может быть на разных компактах, поэтому это связь "многие ко многим". Но, вместе с тем, конкретный диск одновременно может находиться только у одного человека, и один человек может взять несколько дисков - поэтому это связь "многие к одному".
Для фиксации связей нам понадобятся две таблицы. В первой будет записано, какие песни на каких дисках находятся, во второй - у кого из друзей сейчас диск.
Теперь, когда мы разобрались с тем, какой должна быть структура нашей базы, можно набрать несколько команд, чтобы претворить задуманное в жизнь. Все команды будем выполнять в командном интерпретаторе mysql. Можно также набрать их в любом текстовом редакторе, записать в файл, а потом передать на командный вход интерпретатору - и он выполнит наши команды. Например, если мы сделаем текстовый файл db.txt, в котором запишем необходимые команды SQL, то выполнить этот файл можно с помощью команды:
Shell>mysql <DB.TXT pre ><>
Вот как выглядит этот файл:
use audio_cd;
create table cd (
   cd_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   release_year YEAR
);
create table songs(
   song_id SMALLINT unsigned not null auto_increment,
   primary key (song_id),
   song_name VARCHAR(200) not null default "",
   autor_name VARCHAR(100) not null default "",
   description VARCHAR(255) not null default ""
);
create table songs_on_cd(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   song_id SMALLINT unsigned not null REFERENCES songs
);
create table people(
   p_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   addr VARCHAR(255) not null default "",
   phonnum char(6) not null default "000000",
   email varchar(50) not null default ""
);
create table take_disk(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   p_id SMALLINT unsigned not null REFERENCES people
);
У нас есть база, нужно заполнить ее полезной информацией. Для начала добавим в нее несколько дисков с песнями. Для примера возьмем диски "Pink Floyd".
Итак, добавляем диск 1983 года - "The Final Cut":
Mysql>insert into cd values (NULL, 'The Final Cut', 1983);
Добавляем в этот альбом песни:
mysql> insert into songs values
   (NULL, "The post war dream", "Pink Floyd", ""),
   (NULL, "Your possible pasts", "Pink Floyd",""),
   (NULL, "One of the few", "Pink Floyd",""),
   (NULL, "The hero's return", "Pink Floyd",""),
   (NULL, "The gunner's dream", "Pink Floyd",""),
   (NULL, "Paranoyd eyes", "Pink Floyd",""),
   (NULL, "Get your filthy hands off my desert", "Pink Floyd",""),
   (NULL, "The fletcher memorial home", "Pink Floyd",""),
   (NULL, "Southampton dock", "Pink Floyd",""),
   (NULL, "The final cut", "Pink Floyd",""),
   (NULL, "Hot now john", "Pink Floyd",""),
   (NULL, "Two suns in the sunset", "Pink Floyd","");
Нужно присоединить эти песни к диску -для этого заполним таблицу songs_on_cd. Смотрим в соответствующих таблицах, под каким номером находятся песни, а под каким номером - диск. Это можно сделать с помощью команды select:
Mysql>select * from cd;  Mysql>select * from songs;  
Или просмотрев таблицы с помощью графической оболочки.

Из рисунка видно, что нужно добавить песни с номерами 1-12 к диску номер 1:
Mysql>insert into songs_on_cd values (1,1), (1,2), (1,3), (1,4), (1,5),
      (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12); 
Аналогично добавляем альбом 1999 года "Red Hot Chili Peppers" "Californication".
Если возникнет необходимость посмотреть, какие песни на каком диске находятся, можно воспользоваться sql-командой select. Например, чтобы посмотреть, что находится на диске Californication (см. рис. 3), набираем следующую команду:
mysql> select songs.song_name as song, songs.autor_name as autor
from songs, songs_on_cd, cd
where songs.song_id=songs_on_cd.song_id and
cd.cd_id=songs_on_cd.cd_id and cd.name="Californication";

Если мы хотим на время отдать диск кому-то из друзей, то для начала нужно будет ввести координаты этого человека в базу, а потом зафиксировать передачу диска. Вот как это выглядит на языке sql:
Mysql>insert into people values
   (NULL, "Ivanov Ivan", "st. Lenina 53,34", "4523412", "ivan@mail.ru");
Передаем диск:
Mysql> insert into take_disk values (1,1);
И последний пример - посмотрим, у кого находится диск "The Final Cut" (см. рис. 4):
mysql> select people.name as "Name", people.addr as "Address",
people.phonnum as "Phone", people.email from people, cd, take_disk
where take_disk.cd_id=cd.cd_id and take_disk.p_id=people.p_id and
cd.name='The Final Cut';

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

Напутствие в дорогу

Mysql - быстрая и надежная система управления базами данных, хотя ее редко используют, набирая все команды вручную - так, как это сделали мы. Обычно она играет свою роль за кулисами, обслуживая разнообразнейшие веб-сайты. Мы также можем создать с помощью PHP или Perl собственный веб-сайт для учета музыкальных дисков. Но использование этих языков для доступа к mysql - это уже тема для отдельной статьи.