Реляционные базы данных. Введение

В этой статье поговорим о реляционных базах данных и теоретических основах баз данных.

Данные и программы

Данные живут дольше программ. Программы часто меняются (именно поэтому существуют понятие версии ПО). Иногда с одними и теми же данными работают несколько программ одновременно. Поэтому данные принято отделять от программ, храня их в базах данных.

База данных — представленная в объективной форме совокупность самостоятельных материалов (статей, расчётов, нормативных актов, судебных решений и иных подобных материалов), систематизированных таким образом, чтобы эти материалы могли быть найдены и обработаны с помощью электронной вычислительной машины (ЭВМ).

Википедия

Базой данных, пускай и примитивной, могут выступать текстовые файлы.

Что не так с файлами?

Дело в том, что файлы довольно ограничены по возможностям, к примеру, при работе с большим объемом данных нужно обеспечить их компактность. Их лучше записывать в бинарном, а не текстовом формате, возможно, применяя сжатие, что не читабельно: потребуется конвертация данных в формат, понятный человеку.

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

В файлы очень легко записывать информацию в самый конец, однако сложно отредактировать запись в середине. Кроме того, чтобы что-то найти в файле, приходится его сканировать от начала до конца. Ситуация еще больше усложняется, если наш файл гигантского объема и просто не убирается на одном компьютере. И вот у вас уже несколько файлов, которые хранятся на нескольких компьютерах.
Что бы искать что-то в них, придется писать свой софт. А что делать если необходимо реализовать параллельное редактирование данных?

Для решения этих проблем были созданы программные надстройки, так называемые системы управления базами данных (СУБД). Более подробно здесь.

Основы реляционных баз данных

Данные в реляционных базах данных организованы в виде таблиц, каждая таблица имеет уникальное имя.

Пустая таблица

Строки в таблицах представляют отдельную сущность, их так же называют записью, иногда кортежем. Столбцы же представляют собой составляющий элемент данных, атрибут кортеж; аналог поля объекта если вы знакомы с ООП. Данные одного столбца имеют один и тот же тип. Все столбцы таблицы должны иметь уникальные для таблицы имена. Порядок следования столбцов определяется при создании таблицы. В любой таблице должен быть как минимум один столбец. В отличие от столбцов, строки не имеют определенного порядка, так как запись грубо говоря представляется как экземпляр заданного множества. Таблица так же может быть пустой, что означает что в ней нет записей, но она сохраняет заданную структуру.

Не удивляйся именам и датам, ведь в Скайриме шел 250 год 4 эры…

Так как строки в таблицах не упорядочены, то мы не можем получить запись по номеру строки, в таблице нет нумерации строк. В правильно построенных таблицах выделяют специальный столбец или группу столбцов — первичный ключ (primary key) — значения столбца (или комбинации столбцов) во всех строках должны быть уникальны. Таблица, в которой все строки уникальны, может быть интерпретирована как отношение (на англ. relation), что и объясняет название данной модели данных.

Связи между таблицами

В реляционных СУБД связь «потомок-предок» реализована посредством двух значений хранящихся в двух таблицах. Столбец одной таблицы, значения в котором совпадают со значениями столбца, являющегося первичным ключом другой таблицы, называется внешним ключом (foreign key). Одним из главных преимуществ реляционных баз данных — возможность извлекать связанные между собой данные, используя эти отношения.

race_id — внешний ключ, id в таблице Races первичный ключ

Транзакции

В приложении многое может пойти не так:

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

Все эти проблемы обычно решаются при помощи транзакций. Транзакции — это способ группировки приложением нескольких операций записи и чтения в одну логическую единицу. По сути все операции записи и чтения в ней выполняются как одна: вся транзакция либо целиком выполняется успешно (с фиксацией изменений) или целиком завершается неудачно (с прерыванием и откатом к исходному состоянию). Транзакции обеспечивают выполнение требований ACID.

Принцип ACID

ACID описывает требования к системе, обеспечивающие надежную и предсказуемую ее работу. Принцип ACID состоит из четырех требований: Atomicity, Consistency, Isolation и Durability.

Atomicity — Атомарность

Атомарность гарантирует что транзакция не будет зафиксирована частично, то есть будут выполнены все подоперации транзакции, либо не будет выполнена ни одна. Без атомарности сложно было бы понять, какие операции уже выполнены, а какие — нет. На практике реализуется с помощью отката базы данных в исходное состояние, если транзакцию не удается завершить.

Consistency — Согласованность

Согласованность означает выполнение бизнес-правил: при выполнении транзакции БД должна переходить из одного нормального состояния в другое. Другими словами транзакция фиксирует только допустимые значения. К примеру в бухучете кредит должен сходится с дебетом. Если транзакция выполняется в базе данных удовлетворяющей данному правилу, то после выполнения транзакции она (база данных) должна удовлетворять этому правилу.

В ходе выполнения транзакции согласованность не требуется. Скорее всего между двумя подоперациями транзакции будет переход БД в несогласованное состояние. Однако, в силу атомарности и изолированности эта промежуточная несогласованность не будет видна.

Isolation — Изолированность

Во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат. То есть параллельные транзакции выполняются будто бы последовательно. Требование изолированности вычислительно дорогое, поэтому современные СУБД предоставляют режимы работы не полностью изолирующие транзакцию.

Durability — Стойкость

Независимо от проблем на низком уровне (сбои в оборудовании или обесточивание системы) изменения, сделанные успешно выполненной транзакцией должны сохраняться. Другими словами, пользователь получивший подтверждение СУБД, об успешном выполнении транзакции может быть уверен, что при сбое сделанные им изменения не отменяться.


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

CAP-теорема

CAP-теорема гласит что в любой реализации распределенных вычислений гарантированно можно обеспечить только два из трех следующих свойств:

  • Согласованность данных — во всех вычислительных узлах в один момент времени данные не противоречат друг другу
  • Доступность — любой запрос к БД завершается корректным откликом, то есть БД всегда имеют считывать и записывать данные.
  • Устойчивость к разделению — расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.

Подробнее

Вместо вывода

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

0-post

Что там пишут люди в первом посте? Самое сложное в любом деле — это начать делать. Первые шаги в любой сфере наиболее трудные. Помню как сам некоторое время не мог сначала понять что такое процедуры и функции в Pascal, а позже не понимал велика ли разница, чтобы их синтаксически различать. Думаю прежде чем писать что-либо в блоге, неплохо бы представиться. Итак, первый пост начнем по доброй традиции:

Who is this guy?

Меня зовут Сирожиддин. Я студент Казанского Федерального Университета, направление обучения — прикладная информатика. Родом я из солнечной Ферганы. Вне стен университета, люблю читать, обожаю Айтматова и Солженицына; смотрю фильмы, очень много фильмов. Прежде чем поступить в КФУ, я учился в филологическом лицее, изучал иностранные языки, как-то английский и немного французский. У меня семья филологов: родители познакомились учась в педагогическом, но только мама работала по специализации (родители для меня ярчайшие примеры того, что не всегда удается работать по специализации, жизнь диктует свои правила). Учась в лицее увлекся компьютерами, некоторое время вел микроблог с новостями мобильного рынка и обзором приложений, но пришлось его забросить, так как нужно было готовиться к поступлению в вуз, а в филологическом лицее не преподавались точные науки.

Это я

В первые же дни учебы в вузе я понял что, подготовился весьма плохо, Паскаль не знал, математику не понимал, да и стресса добавляло и то, что уехал далеко от родных краев, и почти никого вокруг не знал. Долгое время во мне жило желание вернуться, то что ничего не получится. После первой сессии немного успокоился, хотя и закрыл её на тройки: платникам можно, к слову некоторые контрактники вообще не парятся по этому поводу, главное чтобы не было пересдач. Со второго семестра начал что-то схватывать, стал понимать на какие предметы стоит потратить больше времени, появился кое-какой подход к учебе.

Почему веду блог?

На одной из лекций по истории, лектор как-то сказала, что вуз по большому счёту направляет студентов, и за большую часть образования ответственны сами студенты, если студент сам не старается, то вуз вряд ли сможет чем-то помочь. Эта мысль была прямым отражением изменений в моем подходе к обучению. В лицее, в школе нам вели уроки и давали домашние задания, участие на уроке и успешное выполнение ДЗ гарантировали хорошую оценку (знаю что оценка не показатель образования, но всё же). В вузе такое не прокатило, обучение в вузе потребовало навыка, которому нигде не обучают — умение учится. К сожалению, даже сейчас не могу сказать что у меня хорошо получается учиться, и главная проблема, которую я не могу преодолеть — это мой излишний идеализм, иногда переходящий в максимализм. Что бы там ни было, новый подход предполагал то, что кроме чтения учебников, участия в лекциях/семинарах и выполнения домашних задания (практических работ?), нужно черпать знания из других источников. Первые такие источники для меня были форумы и статьи с различных сайтов. Позже начал смотреть некоторые видео с Youtube, смотрел некоторые курсы на Stepik и Coursera. А сейчас чаще заглядываю в документацию того или иного продукта, возможно изменилась проблематика, а возможно и подход.

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

Ведение блога, это своего рода knowledge sharing, попытка что-то рассказать, и что бы этот рассказ был рассказом, а не конспектом, нужна структура. Когда приходится что-то кому-то объяснять, нужно самому быть хорошо подготовленным, кроме того если вы усваиваете материал с целью преподавать, то данный материал усваивается лучше (источник). Так же по идеи этот блог должен меня замотивировать что-либо изучать: чтобы писать о чем либо, нужно самому разбираться в этом, да люди читающие блог возможно оставят свой комментарий, как можно что-то сделать лучше. Ну а на выходе мы имеем блог-сборник статей, а может коротких постов о том что я изучал, а может только собираюсь.

Так о чем всё-таки будет блог?

В основном в блоге будет излагаться моё глубоко субъективное мнение, иногда стереотипное😀. Ну а если серьёзно, блог будет посвящен IT-сфере, программированию и Computer science в целом; возможно буду писать над чем работаю/работал. В основном это будет оформлено в виде статей, которые будут поститься раз в неделю, возможно чаще, возможно реже. Пока есть несколько идей серий статей, но они пока в планах, возможно что в ближайшее время не смогу их написать. Гораздо чаще в блоге будут появляться мини-посты, скажем так обновления моего текущего состояния, может просто tips and tricks. Возможно так же буду постить обзоры курсов, которые прошел, или книг, оставивших впечатления. На данном этапе мои видения блога весьма расплывчаты. Одно дело репостить новости, другое дело пытаться писать что-то свое.

Кто мой потенциальный читатель?

Все желающие, в основном мой блог будет интересен тем, кто только учится, студентам. Возможно кто-то найдет решение своей проблемы. Аудитория в широком аспекте ограничена теми, кто интересуется разработкой ПО, информатикой (никогда не понимал почему Computer science переводят как информатика, ну да ладно, об этом позже) и смежными науками. Я буду всем рад!

Есть что мне сказать?

Не стесняйся, пиши мне на почту, или отправь сообщение прямо в WordPress (без регистрации и СМС). Кроме того можешь написать в любой соцсети, контакты прикреплены в шапке сайта. Можешь оставлять комментарии к постам. Так же в скором времени попытаюсь продублировать блог в соцсетях, сможешь читать меня там где тебе удобней.