Перевод статьи SQL vs. NoSQL databases.
SQL базы данных.
Язык структурированных запросов (Structured Query Language, SQL) — это стандартизированный язык для управления данными и запроса данных в реляционных базах данных. Такие базы данных организуют данные в таблицы, состоящие из строк и столбцов. Каждая таблица обычно представляет собой отдельный объект, и SQL помогает определять отношения между этими объектами и управлять ими. Язык запросов — это средство взаимодействия с данными. Вы можете выполнять различные операции, такие как добавление новых данных (INSERT
), обновление существующих данных (UPDATE
), удаление данных (DELETE
) или получение данных (SELECT
), используя различные запросы.
Различные системы управления базами данных, такие как MySQL и PostgreSQL, используют SQL в качестве языка запросов.
// Этот фрагмент SQL создает таблицу пользователей и таблицу cities_lived, затем записывает пользователя и города, в которых он жил. Он показывает нормализацию данных: разделение данных для минимизации избыточности и обеспечения согласованности.
CREATE TABLE users (
userId INT PRIMARY KEY,
name VARCHAR(255),
age INT,
email VARCHAR(255)
);
CREATE TABLE cities_lived (
userId INT,
city VARCHAR(255),
FOREIGN KEY (userId) REFERENCES users(userId)
);
INSERT INTO users (name, age, email) VALUES ('John', 30, 'john@doe.com');
INSERT INTO cities_lived (userId, city) VALUES
((SELECT userId FROM users WHERE email = 'john@doe.com'), 'New York'),
((SELECT userId FROM users WHERE email = 'john@doe.com'), 'Los Angeles');
Базы данных SQL отдают приоритет точности, целостности и обеспечению взаимосвязей, часто инкапсулированных в структурированную, предопределенную схему.
Они были в первую очередь разработаны для вертикальной масштабируемости, что означает расширение аппаратных возможностей сервера для повышения производительности. Например, вы можете обновить сервер, установив более быстрый процессор, добавить оперативную память или более быстрый диск.
Вертикальное масштабирование. Этот метод увеличивает емкость и производительность за счет обновления оборудования существующего сервера.. Этот метод увеличивает емкость и производительность за счет обновления оборудования существующего сервера.
Однако эти базы данных также поддерживают горизонтальное масштабирование посредством сегментирования (шардинга) данных. Это предполагает разделение базы данных на более мелкие и более управляемые части - шарды (или сегменты). Шарды могут быть распределены по множеству серверов и позволяют системе обрабатывать увеличенные объемы трафика и данных без ущерба для производительности.
Базы данных SQL совместимы с ACID. Это означает, что они соответствуют набору свойств — атомарности, согласованности, изоляции, надежности — которые усиливают целостность данных и управление транзакциями, что необходимо для приложений, в которых точность и надежность данных имеют решающее значение.
Атомарность
: каждая транзакция рассматривается как отдельная единица, что обеспечивает полный успех или неудачу.Согласованность
: в базу данных записываются только валидные данные, что обеспечивает целостность системы.Изоляция
: параллельные транзакции обрабатываются таким образом, что результат такой же, как если бы они обрабатывались индивидуально, что предотвращает потенциальное вмешательство.Надежность
: зафиксированные транзакции сохраняются даже во время сбоев системы.
Приложения, в которых согласованность и точность данных имеют первостепенное значение, например финансовые или медицинские системы, часто выбирают базы данных SQL.
NoSQL базы данных.
Базы данных NoSQL ("Not Only SQL", "Не только SQL") обеспечивают большую гибкость при обработке неструктурированных или полуструктурированных данных. Эти базы данных не требуют фиксированной схемы.
Методы запроса могут различаться в зависимости от базы данных NoSQL. MongoDB, например, использует язык запросов на основе методов, синтаксис которого похож на JavaScript:
db.collection('users').insertOne({
name: 'John',
age: 30,
email: 'john@example.com',
cities_lived: ['New York', 'Los Angeles']
});
NoSQL базы данных оптимизированы для конкретных задач, требующих большей гибкости, таких как хранение документов, пар "ключ-значение" или графов. Они отдают приоритет горизонтальному масштабированию, которое достигается с помощью таких методов, как сегментирование или секционирование — распределение данных по нескольким серверам для размещения большего трафика. Эта конструкция предназначена для высокопроизводительных веб-приложений, работающих с большими объемами данных.
Горизонтальное масштабирование. Этот метод распределяет данные и нагрузку между несколькими серверами, повышая производительность и емкость.
В отличие от SQL, где нормализация данных требует отдельных таблиц, базы данных NoSQL упрощают это, позволяя хранить связанные данные вместе, что снижает сложность запросов.
Горизонтальный шардинг
Горизонтальный шардинг предполагает распределение строк данных по нескольким серверам, поэтому каждый сервер содержит все необходимые столбцы, но только для определенного подмножества пользователей. Этот подход отлично подходит для баз данных NoSQL, поскольку позволяет им распределять большие наборы данных по нескольким серверам или кластерам, улучшая горизонтальную масштабируемость.
Горизонтальный шардинг.
Однако тот факт, что базы данных NoSQL могут хранить связанные данные вместе, может быть менее эффективным с точки зрения использования пространства и может усложнить агрегацию.
В SQL агрегирование и операции JOIN
более просты, поскольку структурированные нормализованные данные облегчают выполнение сложных запросов. Однако в NoSQL вам может потребоваться создать индекс для поддержки более сложных агрегатов. Это компромисс между сложностью запроса и масштабируемостью.
Базы данных NoSQL обычно следуют теореме CAP:
Согласованность
: аналогично согласованности ACID, обеспечение согласованности данных после транзакций в распределенной системе.Доступность
: система остается работоспособной как при чтении, так и при записи, даже при разделении сети.Терпимость к разделению
: система работает, несмотря на разделение сети, что является обычным явлением в распределенных системах из-за различных сетевых проблем.
Разделение сети — это нарушение связи внутри распределенной системы. Представьте себе группу связанных компьютеров, внезапно теряющих связь с некоторыми другими членами группы. Этот сценарий часто встречается в распределенных установках из-за проблем, связанных с сетью или с сетевым оборудованием.
Согласно теореме CAP, базы данных могут гарантировать только два из этих трех пунктов во время разделения сети.
Компромиссы между этими свойствами зависят от требований. Например, установка приоритетов согласованности и устойчивости разделов может привести к периодической недоступности для чтения и записи.
В другом руководстве мы исследуем различия между популярными вариантами SQL и NoSQL, такими как MySQL, PostgreSQL и MongoDB.
Поделиться