Что такое реляционная база данных простыми словами
Артём Санников
Языки программирования
Базы данных
Программное обеспечение
Операционные системы
Мобильная разработка
Менеджеры пакетов
Сетевые технологии
CMS системы
Математика
SEO продвижение
Социальные сети
Психология
Хостинг провайдер
Смартфоны
Что такое реляционная база данных?
Что такое реляционная база данных?
Реляционная база данных — это связанная информация, представленная в виде двумерных таблиц. Представьте себе адресную книгу. Она содержит множество строк, каждая из которых соответствует данному индивидууму. Для каждого из них в ней представлены некоторые независимые данные, например, имя, номер телефона, адрес. Представим такую адресную книгу в виде таблицы, содержащей строки и столбцы. Каждая строка (называемая также записью) соответствует определенному индивидууму, каждый столбец содержит значения соответствующего типа данных: имя, номер телефона и адрес, представленных в каждой строке. Адресная книга может выглядеть таким образом:
То, что мы получили, является основой реляционной базы данных, определенной в начале нашего обсуждения двумерной (строки и столбцы) таблицей информации. Однако, реляционная база данных редко состоит из одной таблицы, которая слишком мала по сравнению с базой данных. При создании нескольких таблиц со связанной информацией можно выполнять более сложные и мощные операции над данными. Мощность базы данных заключается, скорее, в связях, которые вы конструируете между частями информации, чем в самих этих частях.
Установление связи между таблицами
Давайте используем пример адресной книги для того, чтобы обсудить базу данных, которую можно реально использовать в деловой жизни. Предположим, что индивидуумы первой таблицы являются пациентами больницы. Дополнительную информацию о них можно хранить в другой таблице. Столбцы второй таблицы могут быть поименованы таким образом: Patient (Пациент), Doctor (Врач), Insurer (Страховка), Balance (Баланс).
Можно выполнить множество мощных функций при извлечении информации из этих таблиц в соответствии с заданными критериями, особенно, если критерий включает связанные части информации из различных таблиц.
Предположим, Dr.Halben желает получить номера телефонов всех своих Пациентов. Для того чтобы извлечь эту информацию, он должен связать таблицу с номерами телефонов пациентов (адресную книгу) с таблицей, определяющей его пациентов. В данном простом примере он может мысленно проделать эту операцию и узнать телефонные номера своих пациентов Grillet и Brock, в действительности же эти таблицы вполне могут быть больше и намного сложнее.
Программы, обрабатывающие реляционные базы данных, были созданы для работы с большими и сложными наборами тех данных, которые являются наиболее общими в деловой жизни общества. Даже если база данных больницы содержит десятки или тысячи имен (как это, вероятно, и бывает в реальной жизни), единственная команда SQL предоставит доктору Halben необходимую информацию практически мгновенно.
Порядок строк произволен
Для обеспечения максимальной гибкости при работе с данными строки таблицы, по определению, никак не упорядочены. Этот аспект отличает базу данных от адресной книги. Строки в адресной книге обычно упорядочены по алфавиту. Одно из мощных средств, предоставляемых реляционными системами баз данных, состоит в том, что пользователи могут упорядочивать информацию по своему желанию.
Рассмотрим вторую таблицу. Содержащуюся в ней информацию иногда удобно рассматривать упорядоченной по имени, иногда — в порядке возрастания или убывания баланса (Balance), а иногда — сгруппированной по доктору. Внушительное множество возможных порядков строк помешало бы пользователю проявить гибкость в работе с данными, поэтому строки предполагаются неупорядоченными. Именно по этой причине вы не можете просто сказать: «Меня интересует пятая строка таблицы». Независимо от порядка включения данных или какого-либо другого критерия, этой пятой строки не существует по определению. Итак, строки таблицы предполагаются расположенными в произвольном порядке.
Идентификация строк (первичный ключ)
По этой и ряду других причин, необходимо иметь столбец таблицы, который однозначно идентифицирует каждую строку. Обычно этот столбец содержит номер, например, приписанный каждому пациенту. Конечно, можно использовать для идентификации строк имя пациента, но ведь может случиться так, что имеется несколько пациентов с именем Mary Smith. В подобном случае нет простого способа их различить. Именно по этой причине обычно используются номера. Такой уникальный столбец (или их группа), используемый для идентификации каждой строки и обеспечивающий различимость всех строк, называется первичным ключом таблицы (primary key of the table).
Первичный ключ таблицы — жизненно важное понятие структуры базы данных. Он является сердцем системы данных: для того чтобы найти определенную строку в таблице, укажите значение ее первичного ключа. Кроме того, он обеспечивает целостность данных. Если первичный ключ должным образом используется и поддерживается, вы будете твердо уверены в том, что ни одна строка таблицы не является пустой и что каждая из них отлична от остальных.
Столбцы поименованы и пронумерованы
В отличие от строк, столбцы таблицы (также называемые полями (fields) упорядочены и поименованы. Следовательно, в нашей таблице, соответствующей адресной книге, можно сослаться на столбец «Address» как на «столбец номер три». Естественно, это означает, что каждый столбец данной таблицы должен иметь имя, отличное от других имен, для того, чтобы не возникло путаницы. Лучше всего, когда имена определяют содержимое поля. В этой книге мы будем использовать аббревиатуру для именования столбцов в простых таблицах, например: cname — для имени покупателя (customer name), odate — для даты поступления (order date). Предположим также, что таблица содержит единственный цифровой столбец, используемый как первичный ключ.
Пример базы данных
Таблицы 1.1, 1. 2, 1.3 образуют реляционную базу данных, которая достаточно мала для того, чтобы можно было понять ее смысл, но и достаточно сложна для того, чтобы иллюстрировать на ее примере важные понятия и практические выводы, связанные с применением SQL.
Можно заметить, что первый столбец в каждой таблице содержит номера, не повторяющиеся от строки к строке в пределах таблицы. Как вы, наверное, догадались, это первичные ключи таблицы. Некоторые из этих номеров появляются также в столбцах других таблиц (в этом нет ничего предосудительного), что указывает на связь между строками, использующими конкретное значение первичного ключа, и той строкой, в которой это значение применяется непосредственно в первичном ключе.
Например, поле snum в таблице Customers определяет, каким продавцом (salespeople) обслуживается конкретный покупатель (customer). Номер поля snum устанавливает связь с таблицей Salespeople, которая дает информацию об этом продавце (salespeople). Очевидно, что продавец, который обслуживает данного покупателя, существует, т.е. значение поля snum в таблице Customers присутствует также и в таблице Salespeople. В этом случае мы говорим, что система находится в состоянии ссылочной целостности (referential integrity).
Сами по себе таблицы предназначены для описания реальных ситуаций в деловой жизни, когда можно использовать SQL для ведения дел, связанных с продавцами, их покупателями и заказами. Давайте зафиксируем состояние этих трех таблиц в какой-либо момент времени и уточним назначение каждого из полей таблицы.
Перед вами объяснение столбцов таблицы 1.1:
Поле | Содержимое |
snum | Уникальный номер, приписанный каждому продавцу («номер служащего») |
sname | Имя продавца |
city | Место расположения продавца |
comm | Вознаграждение (комиссионные) продавца в форме с десятичной точкой |
Таблица 1.2 содержит следующие столбцы:
Поле | Содержимое |
cnum | Уникальный номер, присвоенный покупателю |
cname | Имя покупател |
city | Место расположения покупателя |
rating | Цифровой код, определяющий уровень предпочтения данного покупателя. Чем больше число, тем больше предпочтение |
snum | Номер продавца, назначенного данному покупателю (из таблицы Salesperson) |
И, наконец, столбцы таблицы 1.3:
Поле | Содержимое |
onum | Уникальный номер, присвоенный данной покупке |
amt | Количество |
odate | Дата покупки |
cnum | Номер покупателя, сделавшего покупку (из таблицы Customers) |
snum | Номер продавца, обслужившего покупателя (из таблицы Salespeople) |
Источник: SQL для простых смертных / Мартинн Грабер
Реляционные базы данных для чайников
Как правило, любое веб приложение можно разделить на 2 основные части: фронт-энд, где отображается вся информация сайта, и бэк-энд, где данная информация формируется и размещается. В этой статье мы поговорим о том, что такое реляционные базы данных, и как их проектировать.
База данных хранит записи в специально организованном виде, чтобы информацию можно было легко найти и извлечь. Любая БД состоит из одной или нескольких таблиц. Электронная таблица состоит из строк и столбцов. Все строки имеют одинаковые столбцы, а каждый столбец содержит данные. В общем, для лучшего понимания, определимся, что таблицы в БД очень похожи на те, что вы видели в Excel-е.
Fig. 1
Табличные данные могут быть вставлены, восстановлены, обновлены и удалены. Для пакета этих операций была создана специальная аббревиатура CRUD (Create-Read-Update-Delete).
Но всё это всего лишь слова. Для того чтобы действительно понять, что такое реляционные базы данных, вам нужно больше практиковаться. Давайте же начнём и посмотрим, с какими данными нам предстоит работать.
Шаг 1: Подготовка данных
Для того чтобы нам было с чем работать, я набрал в твиттере запрос “#databases” и сформировал таблицу из 10 записей:
Таблица 1
В первую очередь, давайте разберёмся с колонками:
Это реальные данные. Если хотите, вы можете их найти и обновить.
Хорошо. Теперь все наши данные находятся в одном месте. Даёт ли это нам возможность легко осуществить поиск по ним? Не совсем. Данная таблица далека от идеала. Во-первых, в некоторых столбцах у нас есть повторяющиеся записи: к примеру, в х “username” и “following_username”. Также колонка “following_username” нарушает правила реляционных моделей, т.к. её в ячейках присутствует более 1 значения (записи разделены запятыми).
К тому же у нас попадаются дубликаты и в строках.
Повторяющиеся данные действительно являются проблемой, т.к. они затрудняют процесс CRUD. К примеру, при поиске по данной таблице на обработку дубликатов будет уходить дополнительное время. К тому же, если пользователь обновит твитт, то нам нужно будет перезаписать все дубликаты.
Шаг 2: Избавляемся от дубликатов в столбцах
Fig. 2
Поскольку @Brett_Englebert подписан на @RealSkipBayless, то в таблице “following” отобразим это следующим образом: имя @Brett_Englebert поместим в колонку “from_user”, а @RealSkipBayless в “to_user.” Давайте посмотрим, как будет выглядеть таблица “following” после разделения Таблицы 1:
Таблица 2: following
from_user | to_user |
---|---|
_DreamLead | Scootmedia |
_DreamLead | MetiersInternet |
GunnarSvalander | klout |
GunnarSvalander | zillow |
GEsoftware | DayJobDoc |
GEsoftware | byosko |
adrianburch | CindyCrawford |
adrianburch | Arjantim |
AndyRyder | MichaelDell |
AndyRyder | Yahoo |
Brett_Englebert | RealSkipBayless |
Brett_Englebert | stephenasmith |
NimbusData | dellock6 |
NimbusData | rohitkilam |
SSWUGorg | drsql |
SSWUGorg | steam_games |
Таблица 3: users
full_name | username | text | created_at |
---|---|---|---|
«Boris Hadjur» | «_DreamLead» | «What do you think about #emailing #campaigns #traffic in #USA? Is it a good market nowadays? do you have #databases?» | «Tue, 12 Feb 2013 08:43:09 +0000» |
«Gunnar Svalander» | «GunnarSvalander» | «Bill Gates Talks Databases, Free Software on Reddit http://t.co/ShX4hZlA #billgates #databases» | «Tue, 12 Feb 2013 07:31:06 +0000» |
«GE Software» | «GEsoftware» | «RT @KirkDBorne: Readings in #Databases: excellent reading list, many categories: http://t.co/S6RBUNxq via @rxin Fascinating.» | «Tue, 12 Feb 2013 07:30:24 +0000» |
«Adrian Burch» | «adrianburch» | «RT @tisakovich: @NimbusData at the @Barclays Big Data conference in San Francisco today, talking #virtualization, #databases, and #flash memory.» | «Tue, 12 Feb 2013 06:58:22 +0000» |
«Andy Ryder» | «AndyRyder5» | «http://t.co/D3KOJIvF article about Madden 2013 using AI to prodict the super bowl #databases #bus311» | «Tue, 12 Feb 2013 05:29:41 +0000» |
«Andy Ryder» | «AndyRyder5» | «http://t.co/rBhBXjma an article about privacy settings and facebook #databases #bus311» | «Tue, 12 Feb 2013 05:24:17 +0000» |
«Brett Englebert» | «Brett_Englebert» | «#BUS311 University of Minnesota’s NCFPD is creating #databases to prevent «food fraud.» http://t.co/0LsAbKqJ» | «Tue, 12 Feb 2013 01:49:19 +0000» |
Brett Englebert | «Brett_Englebert» | «#BUS311 companies might be protecting their production #databases, but what about their backup files? http://t.co/okJjV3Bm» | «Tue, 12 Feb 2013 01:31:52 +0000» |
«Nimbus Data Systems» | «NimbusData» | «@NimbusData CEO @tisakovich @BarclaysOnline Big Data conference in San Francisco today, talking #virtualization, #databases,& #flash memory» | «Mon, 11 Feb 2013 23:15:05 +0000» |
«SSWUG.ORG» | «SSWUGorg» | «Don’t forget to sign up for our FREE expo this Friday: #Databases, #BI, and #Sharepoint: What You Need to Know! http://t.co/Ijrqrz29» | «Mon, 11 Feb 2013 22:15:37 +0000» |
Основатель теории реляционных баз данных, Эдгар Кодд, назвал бы этот процесс (удаления повторений из столбцов таблиц) приведением БД к первой нормальной форме.
Шаг 3: Удаление повторений из строк
Теперь мы займёмся устранением других проблем, а именно, избавимся от дубликатов в строках таблицы “users”. Поскольку пользователи @AndyRyder5 и @Brett_Englebert разместили по несколько твиттов, то их имена в таблице “users” (Таблица 3) дублируются в колонке full_name. Данная проблема также решается разделением таблицы “users”..
Fig. 3
Поскольку текст твитта и время его создания являются уникальными данными, то их мы поместим в одну и ту же таблицу. Также нам нужно указать связь между твитами и пользователями. Для этого я создал специальный столбец username:
Таблица 4: tweets
text | created_at | username |
---|---|---|
«What do you think about #emailing #campaigns #traffic in #USA? Is it a good market nowadays? do you have #databases?» | «Tue, 12 Feb 2013 08:43:09 +0000» | «_DreamLead» |
«Bill Gates Talks Databases, Free Software on Reddit http://t.co/ShX4hZlA #billgates #databases» | «Tue, 12 Feb 2013 07:31:06 +0000» | «GunnarSvalander» |
«RT @KirkDBorne: Readings in #Databases: excellent reading list, many categories: http://t.co/S6RBUNxq via @rxin Fascinating.» | «Tue, 12 Feb 2013 07:30:24 +0000» | «GEsoftware» |
«RT @tisakovich: @NimbusData at the @Barclays Big Data conference in San Francisco today, talking #virtualization, #databases, and #flash memory.» | «Tue, 12 Feb 2013 06:58:22 +0000» | «adrianburch» |
«http://t.co/D3KOJIvF article about Madden 2013 using AI to prodict the super bowl #databases #bus311» | «Tue, 12 Feb 2013 05:29:41 +0000» | «AndyRyder5» |
«http://t.co/rBhBXjma an article about privacy settings and facebook #databases #bus311» | «Tue, 12 Feb 2013 05:24:17 +0000» | «AndyRyder5» |
«#BUS311 University of Minnesota’s NCFPD is creating #databases to prevent «food fraud.» http://t.co/0LsAbKqJ» | «Tue, 12 Feb 2013 01:49:19 +0000» | «Brett_Englebert» |
«#BUS311 companies might be protecting their production #databases, but what about their backup files? http://t.co/okJjV3Bm» | «Tue, 12 Feb 2013 01:31:52 +0000» | «Brett_Englebert» |
«@NimbusData CEO @tisakovich @BarclaysOnline Big Data conference in San Francisco today, talking #virtualization, #databases,& #flash memory» | «Mon, 11 Feb 2013 23:15:05 +0000» | «NimbusData» |
«Don’t forget to sign up for our FREE expo this Friday: #Databases, #BI, and #Sharepoint: What You Need to Know! http://t.co/Ijrqrz29» | «Mon, 11 Feb 2013 22:15:37 +0000» | «SSWUGorg» |
Таблица 5: users
full_name | username |
---|---|
«Boris Hadjur» | «_DreamLead» |
«Gunnar Svalander» | «GunnarSvalander» |
«GE Software» | «GEsoftware» |
«Adrian Burch» | «adrianburch» |
«Andy Ryder» | «AndyRyder5» |
«Brett Englebert» | «Brett_Englebert» |
«Nimbus Data Systems» | «NimbusData» |
«SSWUG.ORG» | «SSWUGorg» |
После разделения в таблице users (Таблица 5) у нас присутствуют уникальные (не повторяющиеся) строки.
Данный процесс удаления дубликатов из строк называется приведением ко второй нормальной форме.
Шаг 4: Объединяем таблицы на основе ключей
Итак, в результате наших действий, Таблица 1 была разбита на 3 части: following (Таблица 2), tweets (Таблица 4), users (Таблица 5). Все дубликаты устранены. Для того чтобы в дальнейшем мы могли с лёгкостью извлекать данные из этой структуры, независимые друг от друга таблицы мы должны связать специальными отношениями, которые будут давать нам информацию о том, какому пользователю принадлежит какой твит, и кто на кого подписан.
Для создания связей между записями нам необходимо ввести уникальный идентификатор, который называется первичный ключ.
Вообще говоря, в Таблице 4 и 5 мы уже это сделали. В таблице “users” первичным ключом является колонка “username”, потому что логин пользователя должен быть уникальным значением и не может повторяться. В таблице “tweets” мы используем данный ключ для обозначения связи между пользователем и твитом. Колонка “username” в таблице “tweets” называется внешним ключом.
Если вы когда-то работали с базами данных, то у вас может возникнуть вопрос: можем ли мы использовать колонку “username” в качестве первичного ключа?
С одной стороны, это может упростить процесс поиска, ведь мы не используем никаких числовых ID. С другой стороны, что если пользователь захочет поменять свой логин? Это может привести к огромному количеству проблем. Для того чтобы не попасть в подобную ситуацию, лучше воспользоваться числовыми ID. Всё зависит от вашей системы. Если вы предоставляете вашим пользователям возможность менять логины, то лучше в качестве первичного ключа использовать автоинкрементированное числовое поле ID. В противном случае, колонка “username” вполне подойдёт для этой роли. Я оставлю всё как есть.
Давайте посмотрим на таблицу tweets (Таблица 4). Первичный ключ должен быть уникальным для каждой строки. Какую колонку в данной таблице мы можем выбрать для этой роли? Колонка “created_at” не подойдёт, т.к. в принципе 2 разных пользователя могут в одно и то же время опубликовать запись. С колонкой “text” та же история: два разных пользователя могут создать твит с текстом “Hello World”. Колонка “username” в данной таблице является внешним ключом для обозначения связи между пользователем и твитом. Итак, поскольку все возможные варианты нам не подходят, то лучшим решением будет добавление колонки id, которая будет первичным ключом для данной таблицы.
Таблица 6: tweets с колонкой id
id | text | created_at | username |
---|---|---|---|
1 | «What do you think about #emailing #campaigns #traffic in #USA? Is it a good market nowadays? do you have #databases?» | «Tue, 12 Feb 2013 08:43:09 +0000» | «_DreamLead» |
2 | «Bill Gates Talks Databases, Free Software on Reddit http://t.co/ShX4hZlA #billgates #databases» | «Tue, 12 Feb 2013 07:31:06 +0000» | «GunnarSvalander» |
3 | «RT @KirkDBorne: Readings in #Databases: excellent reading list, many categories: http://t.co/S6RBUNxq via @rxin Fascinating.» | «Tue, 12 Feb 2013 07:30:24 +0000» | «GEsoftware» |
4 | «RT @tisakovich: @NimbusData at the @Barclays Big Data conference in San Francisco today, talking #virtualization, #databases, and #flash memory.» | «Tue, 12 Feb 2013 06:58:22 +0000» | «adrianburch» |
5 | «http://t.co/D3KOJIvF article about Madden 2013 using AI to prodict the super bowl #databases #bus311» | «Tue, 12 Feb 2013 05:29:41 +0000» | «AndyRyder5» |
6 | «http://t.co/rBhBXjma an article about privacy settings and facebook #databases #bus311» | «Tue, 12 Feb 2013 05:24:17 +0000» | «AndyRyder5» |
7 | «#BUS311 University of Minnesota’s NCFPD is creating #databases to prevent «food fraud.» http://t.co/0LsAbKqJ» | «Tue, 12 Feb 2013 01:49:19 +0000» | «Brett_Englebert» |
8 | «#BUS311 companies might be protecting their production #databases, but what about their backup files? http://t.co/okJjV3Bm» | «Tue, 12 Feb 2013 01:31:52 +0000» | «Brett_Englebert» |
9 | «@NimbusData CEO @tisakovich @BarclaysOnline Big Data conference in San Francisco today, talking #virtualization, #databases,& #flash memory» | «Mon, 11 Feb 2013 23:15:05 +0000» | «NimbusData» |
10 | «Don’t forget to sign up for our FREE expo this Friday: #Databases, #BI, and #Sharepoint: What You Need to Know! http://t.co/Ijrqrz29» | «Mon, 11 Feb 2013 22:15:37 +0000» | «SSWUGorg» |
С таблицей following можем сделать то же самое, т.к. ни одна существующая колонка не подойдёт на роль первичного ключа. Колонки “from_user” и “to_user” являются внешними ключами и обозначают связь между подписками пользователей.
Итак, к этому моменту мы уже много чего сделали. Избавились от дублирующей информации в колонках и строках и выбрали для наших таблиц подходящие колонки на роль первичных и внешних ключей для обозначения зависимостей между данными. Данный процесс называется нормализацией и предназначен для приведения ваших таблиц под реляционную модель. Благодаря нормализации мы можем более простым образом реализовывать операции CRUD.
Ниже вы можете увидеть схему наших таблиц и связей между ними.
Fig. 4
Системы Управления Базами Данных
Теперь, когда у нас есть реляционная БД, каким образом мы можем её имплементировать? Для этого мы можем воспользоваться системами управления базами данных (СУБД). Существует целый набор подобных программ, как платных, так и бесплатных. Среди платных можно выделить Oracle Database, IBM DB2 и Microsoft SQL Server. Бесплатные: MySQL, SQLite и PostgreSQL.
SQLite чаще используется при разработке приложений для iOS и Android, где хранится различного рода конфиденциальная информация. Браузер Google Chrome использует SQLite для хранения истории просмотров, кукисов, изображений.
PostgreSQL используется реже. Для неё существует полезное расширение PostGIS, которое делает данную СУБД удобной для хранения геолокационных данных. К примеру сервис OpenStreetMap исользует PostgreSQL.
Язык структурированных запросов (SQL)
После того, как вы выбрали подходящую для вас СУБД и установили её, следующим шагом было бы создание таблиц и управление данными. Для этого мы можем воспользоваться специальным языком SQL.
Создание БД development.
SQL очень похож на человеческий язык (английский). В каждом СУБД SQL обладает рядом собственных особенностей и различий, но в целом, все разновидности SQL похожи друг на друга.
В этом уроке мы разобрали процесс создания реляционной БД, взяли набор данных и распределили их по таблицам, согласно реляционной модели. Также мы быстро пробежались по существующим СУБД и языку SQL.