Зачем нужны базы данных

Если вы буде­те делать веб-приложение — напри­мер интернет-магазин, блог или игры, — почти навер­ня­ка вы столк­нё­тесь с базой дан­ных. Вот что это такое с точ­ки зре­ния про­грам­ми­ро­ва­ния, какие тут основ­ные поня­тия и что с ними делать.

Данные

Вокруг нас все­гда мно­го раз­ных дан­ных, напри­мер:

  • теле­фон­ные номе­ра;
  • дела на день;
  • запи­си на бумаж­ках, сти­ке­рах и в блок­но­тах;
  • опуб­ли­ко­ван­ные мыс­ли раз­ных людей;
  • фото­гра­фии в смарт­фоне;
  • и всё осталь­ное, что мож­но про­чи­тать, уви­деть или услы­шать.

Если это ком­пью­тер­ная игра, то дан­ны­ми будут типы и место­по­ло­же­ния вра­гов, их уро­вень здо­ро­вья, уро­вень здо­ро­вья героя, тип героя, его поло­же­ние, харак­те­ри­сти­ки кар­ты.

Если это при­ло­же­ние для рабо­ты с кли­ен­том, то там будут хра­нить­ся имя кли­ен­та, его зака­зы, номер теле­фо­на, уро­вень в про­грам­ме лояль­но­сти.

Если это служ­ба сле­же­ния за граж­да­на­ми — фото­гра­фия, имя, посе­щён­ные стан­ции мет­ро и ули­цы, место рабо­ты.

База данных и СУБД

Есть поня­тие базы дан­ных — это набор дан­ных, орга­ни­зо­ван­ных каким-то спо­со­бом. Напри­мер, если у вас в квар­ти­ре есть гар­де­роб­ная или кла­дов­ка, то всё это поме­ще­ние со всем её содер­жи­мым может счи­тать­ся базой (но не дан­ных, а вещей или банок с огур­ца­ми, что не меня­ет сути).

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

Для чего нужны

Вот основ­ные зада­чи БД на при­ме­ре гар­де­роб­ной:

  • Сохра­нить наши дан­ные по запро­су — что­бы вы мог­ли открыть дверь, пове­сить курт­ку, закрыть дверь и боль­ше не думать ни о курт­ке, ни о гар­де­роб­ной.
  • Изме­нить наши дан­ные по запро­су — что­бы мож­но было лег­ко извлечь из гар­де­роб­ной все дыря­вые нос­ки и поло­жить на их место целые.
  • Най­ти эти дан­ные по запро­су — что­бы быст­ро най­ти при­лич­ный пиджак или пар­ный носок.
  • Не дать про­чи­тать эти дан­ные тем, кому не сле­ду­ет, а кому надо — дать. Напри­мер, млад­ший брат может смот­реть на ваши крос­сов­ки, но не может их брать. А девуш­ка (или парень) может поло­жить свои вещи, но толь­ко на опре­де­лён­ную пол­ку.
  • Под­дер­жи­вать поря­док и не дать захла­мить­ся — если вам было лень и вы про­сто кину­ли тол­стов­ку куда попа­ло, что­бы гар­де­роб­ная либо сама нашла, куда эту тол­стов­ку пра­виль­но поло­жить, либо ска­за­ла: «Э БРАТ ЗАЧЕМ ЗАХЛАМЛЯЕШЬ ПОЛОЖИ НОРМАЛЬНО ДАВАЙ»
  • Мас­шта­би­ро­вать­ся — что­бы вы мог­ли про­сто вешать в гар­де­роб­ную вещи и не думать об объ­ё­ме полок.
  • Не поте­рять дан­ные — если квар­ти­ра будет гореть, при­лич­ная гар­де­роб­ная не долж­на даже нагреть­ся. Или, если она всё-таки горит, что­бы где-то в защи­щён­ном под­зем­ном гара­же была точ­ная копия этой гар­де­роб­ной со все­ми акту­аль­ны­ми веща­ми.

В чём преимущества

Базы дан­ных и их систе­мы управ­ле­ния зато­че­ны на рабо­ту с боль­шим объ­ё­мом дан­ных и от лица боль­шо­го чис­ла поль­зо­ва­те­лей. Сей­час вы пой­мё­те.

🤔 Пред­ставь­те, что у вас есть эксель­ка со спис­ком кли­ен­тов. Это не база дан­ных, это про­сто таб­ли­ца. Что­бы про­чи­тать или запи­сать что-то в эту эксель­ку, вам нуж­но её открыть, сде­лать дело, сохра­нить.

❌ Допу­стим, эксель­ка с кли­ен­та­ми лежит на сете­вом дис­ке. Вы откры­ли её и ковы­ря­е­тесь в дан­ных, вно­си­те изме­не­ния. Пока вы это дела­е­те, ваш кол­ле­га тоже её открыл и тоже вно­сит изме­не­ния. Потом вы сохра­ни­лись и закры­ли эксель­ку. Эксель­ка пере­за­пи­са­лась ваши­ми дан­ны­ми. Но у ваше­го кол­ле­ги эти дан­ные не отоб­ра­зи­лись, он-то открыл её рань­ше. Теперь, когда он сохра­нит свою эксель­ку, его дан­ные пере­за­пи­шут­ся поверх ваших, а ваши дан­ные про­па­дут. Это пол­ный ахтунг: вся ваша рабо­та поте­ря­на.

❌ Или у вас в ком­па­нии пра­ви­ло: эксель­ка все­гда на одной флеш­ке, рабо­та­ем толь­ко с неё. Сей­час флеш­ка в вашем ком­пью­те­ре, вы с ней рабо­та­е­те. А ваше­му кол­ле­ге нуж­но с ней тоже пора­бо­тать. Он гово­рит: «Дай». Вы ему «Отстань». Ну и сло­во за сло­во…

✅ Но мож­но орга­ни­зо­вать сво­е­го рода СУБД. Один ответ­ствен­ный сотруд­ник назна­ча­ет­ся глав­ным по эксель­ке. Она откры­та на его ком­пью­те­ре, а вы ему гово­ри­те: «Пет­ру­ха, добавь в кли­ен­та такого-то вот такие дан­ные». «Пет­ру­ха, а шо, когда дед­лайн по постав­ке для этих ребят из Воро­не­жа?», «Пет­ру­ха, питер­ские отка­за­лись, поставь там отказ».

Пет­ру­ха — ваша систе­ма управ­ле­ния базой дан­ных. А эксель­ка — это его база дан­ных.

Понят­но, что Пет­ру­ха мед­лен­ный и не все­гда мно­го­за­дач­ный, но хотя бы он избав­ля­ет от про­бле­мы рас­син­хро­на вер­сий и поте­ри дан­ных.

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

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

Слож­ность. Базы дан­ных нуж­ны в чис­ле про­че­го для хра­не­ния слож­но струк­ту­ри­ро­ван­ных дан­ных. Мы при­вык­ли думать, что база дан­ных — это такая таб­ли­ца, где есть стро­ки и столб­цы. Но база дан­ных при пра­виль­ной орга­ни­за­ции может намно­го боль­ше:

  • Свя­зы­вать одну еди­ни­цу дан­ных с мно­же­ством дру­гих. Напри­мер, если один чело­век совер­шил мно­го зака­зов со мно­же­ством това­ров внут­ри каж­до­го, база дан­ных спо­соб­на хра­нить и обра­ба­ты­вать такие свя­зи.
  • База может хра­нить дере­во дан­ных — вро­де того, о кото­ром мы писа­ли недав­но. Попро­буй в реаль­ной жиз­ни похра­нить дере­во!
  • В базах могут жить ссыл­ки на дру­гие фраг­мен­ты и отде­лы базы.

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

База данных — это отдельный файл?

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

Но для поль­зо­ва­те­лей нет раз­ни­цы, как физи­че­ски хра­нит­ся база, это забо­та СУБД. Глав­ное — уметь общать­ся с базой через СУБД.

Где их используют

Базы дан­ных сей­час исполь­зу­ют­ся почти вез­де:

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

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

Как это работает

Возь­мём про­стой при­мер реля­ци­он­ной базы дан­ных (мож­но упро­щён­но ска­зать, что это база дан­ных в виде таб­ли­цы).

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

В нашем при­ме­ре у базы есть поля — Имя, Фами­лия, Теле­фон и Фото, в кото­рых могут хра­нить­ся дан­ные. Одна строч­ка — одна запись с дан­ны­ми.

Если поль­зо­ва­те­лю нуж­но будет най­ти теле­фон Миха­и­ла Мак­си­мо­ва по фами­лии, про­ис­хо­дит сле­ду­ю­щее:

Запрос от поль­зо­ва­те­ля: Выдай мне из базы «Контакты» все записи, где поле «Фамилия» равно «Максимов»

Ответ от базы дан­ных: ЛОЛ КЕК Ты кто такой

Запрос поль­зо­ва­те­ля: Я хозяин этой базы Админ Админыч, пароль •••••. Выдай мне из базы «Контакты» все записи, где поле «Фамилия» равно «Максимов»

Ответ от базы дан­ных: Найдена одна запись: [Михаил, Максимов, +79057362163, вот фото]

Разные базы — разные правила

Внут­ри каж­дой базы дан­ных и её управ­ля­ю­щей систе­мы свои стро­гие пра­ви­ла:

  • какие дан­ные могут хра­нить­ся: текст, циф­ры, фото, видео или всё вме­сте;
  • какие свой­ства есть у этих дан­ных: дата запи­си, кто запи­сал, кто может про­чи­тать;
  • что делать, если с базой хотят рабо­тать одно­вре­мен­но несколь­ко чело­век: раз­ре­шать толь­ко одно­му или пусть все вме­сте рабо­та­ют.

Рабо­чая ситу­а­ция: допу­стим, вы рабо­та­е­те в бан­ке и откры­ли кар­точ­ку кли­ен­та, что­бы поме­нять ему кре­дит­ный лимит. В этот же момент дру­гой сотруд­ник из сосед­не­го офи­са тоже хочет поме­нять лимит это­му же кли­ен­ту, но уже на дру­гую сум­му. Как база отре­а­ги­ру­ет на такое? Долж­на ли она раз­ре­шать вто­ро­му сотруд­ни­ку откры­вать кар­точ­ку или её нуж­но забло­ки­ро­вать, пока пер­вый не закон­чит? А если она раз­ре­шит открыть кар­точ­ку, то что будет, если двое сотруд­ни­ков напи­шут там раз­ный лимит — какой из них сохра­нять в ито­ге? СУБД зада­ёт эти пра­ви­ла и сле­дит за их выпол­не­ни­ем.

Что дальше

В сле­ду­ю­щей ста­тье пого­во­рим про MySQL — буре­рож­дён­ную мать всех баз. Если разо­брать­ся, как она рабо­та­ет, то мож­но тво­рить чуде­са.