# АУД
**Что такое NoSQL?**
NoSQL (Not Only SQL) - это подход к хранению и управлению данными, отличный от традиционных реляционных баз данных. NoSQL базы данных предлагают гибкую модель данных и горизонтальное масштабирование, что делает их полезными для обработки больших объемов данных и распределенных систем.
**Какие есть типы хранилищ данных в NoSQL?**
В NoSQL существует несколько типов хранилищ данных:
Документоориентированные базы данных (например, MongoDB) хранят данные в документах (обычно в формате JSON или BSON).
Колоночные базы данных (например, Apache Cassandra) хранят данные в колонках, а не в строках.
Графовые базы данных (например, Neo4j) используют графовую модель для хранения данных и их связей.
Ключ-значение базы данных (например, Redis) хранят данные в виде пар ключ-значение.
Wide-column базы данных (например, Apache HBase) являются расширением колоночных баз данных и используют модель семейств столбцов для хранения данных.
**Что такое MongoDB?**
MongoDB - это одна из самых популярных документоориентированных NoSQL баз данных. Она предлагает гибкую схему данных и хранит информацию в BSON (бинарном JSON) формате. MongoDB обладает мощными возможностями по горизонтальному масштабированию, репликации данных и полнотекстовому поиску.
**Использует ли MongoDB таблицы для хранения данных?**
Нет, MongoDB не использует таблицы для хранения данных. Вместо этого, данные хранятся в коллекциях, которые содержат документы в формате BSON. Коллекции в MongoDB могут быть схожи с таблицами в реляционных базах данных, но без строгой схемы.
Преимущества MongoDB:
Гибкая схема данных позволяет быстро изменять структуру документов.
Поддержка индексов для быстрого доступа к данным.
Возможность горизонтального масштабирования и обработки больших объемов данных.
Встроенная поддержка репликации и высокой доступности данных.
Мощные механизмы запросов и агрегации данных.
Поддержка полнотекстового поиска и геоиндексов.
Открытый и активно развивающийся экосистема инструментов и драйверов.
Недостатки MongoDB:
Потребление большого объема оперативной памяти.
Ограничения по размеру документа (16 МБ в версии MongoDB до 4.4).
Отсутствие транзакций в некоторых режимах репликации.
Сложности с изменением схемы данных в уже существующих коллекциях.
Что такое репликация?
Репликация в MongoDB - это процесс создания и поддержания копий данных (реплик) для обеспечения отказоустойчивости и высокой доступности. Репликация включает в себя настройку нескольких узлов (нод) в кластере MongoDB, где один из узлов является Primary (главным), а остальные являются Secondary (вторичными) узлами. Данные автоматически реплицируются с Primary на Secondary узлы, обеспечивая резервное копирование и возможность чтения данных с любого узла.
**Поддерживает ли MongoDB ограничения внешнего ключа (FOREIGN KEY)?**
MongoDB не поддерживает ограничения внешнего ключа (FOREIGN KEY) в традиционном смысле, как это делают реляционные базы данных. Вместо этого, связи между коллекциями могут быть установлены путем включения идентификатора (например, ObjectId) из одной коллекции в документ другой коллекции.
**Как можно достичь отношения Primary Key - Foreign Key в MongoDB?**
В MongoDB можно реализовать отношения Primary Key - Foreign Key путем включения идентификаторов (например, ObjectId) из одной коллекции в документ другой коллекции. Нет встроенного механизма, который автоматически поддерживает целостность данных при удалении или обновлении связанных документов. Здесь разработчику нужно самостоятельно управлять связанными данными.
**Что такое ObjectId и как он генерируется?**
ObjectId - это уникальный идентификатор, который используется в MongoDB для идентификации документов. Он состоит из 12-байтового значения, которое включает информацию о времени создания, идентификаторе машины, процесса и случайного числа. ObjectId генерируется автоматически при создании нового документа и обеспечивает уникальность и сортировку данных.
**Что такое индексы в MongoDB?**
Индексы в MongoDB - это механизмы, которые позволяют ускорить операции чтения данных, искать документы по определенным полям и обеспечивать более эффективную фильтрацию данных. Индексы создаются на одно или несколько полей коллекции и хранятся в специальной структуре данных, которая позволяет быстро находить документы по указанным полям.
**Индексы по умолчанию в MongoDB?**
В MongoDB индекс по умолчанию создается для поля "_id", которое является уникальным идентификатором документа. Этот индекс создается автоматически при создании коллекции.
**Что такое шардинг?**
Шардинг (sharding) - это механизм горизонтального масштабирования в MongoDB, при котором данные распределяются по нескольким серверам (шардам). Каждый шард содержит только часть данных, а MongoDB автоматически маршрутизирует запросы к соответствующим шардам. Шардинг позволяет обрабатывать большие объемы данных и повышает пропускную способность и доступность системы.
**Primary и Secondary узлы в реплике**
В репликации MongoDB, Primary (главный) узел отвечает за запись данных и обработку операций записи. Secondary (вторичные) узлы реплики получают данные от Primary и служат для обеспечения отказоустойчивости и возможности чтения данных. Secondary узлы могут быть использованы для распределения нагрузки чтения и резервного копирования данных.
**Условные операторы в MongoDB**
MongoDB предлагает условные операторы, которые позволяют выполнять сложные запросы и операции обновления на основе определенных условий. Некоторые из популярных условных операторов в MongoDB:
$eq: проверка на равенство.
$ne: проверка на неравенство.
$gt: проверка на больше.
$lt: проверка на меньше.
$in: проверка на вхождение в список значений.
$and: логическое "И" условие.
$or: логическое "ИЛИ" условие.
**Операции обновления и вставки в MongoDB**
Для обновления документов в MongoDB используется оператор $set, который устанавливает значение указанного поля.
Для вставки новых документов используется метод insertOne() или insertMany(), которые принимают объекты для вставки.
Селектор запросов MongoDB
Селекторы запросов в MongoDB позволяют указывать критерии для выборки документов из коллекции. Некоторые из селекторов:
find(): основной метод для выборки документов из коллекции.
limit(): ограничение количества выбранных документов.
sort(): сортировка результатов по определенным полям.
skip(): пропуск указанного количества документов.
count(): подсчет количества документов, удовлетворяющих заданным критериям.
К какому типу баз данных принадлежит MongoDB?
MongoDB принадлежит к категории NoSQL баз данных и более конкретно - к документоориентированным базам данных.
**Как создать индекс в MongoDB?**
Для создания индекса в MongoDB используется метод createIndex(). Например, чтобы создать индекс по полю "name" в коллекции "users", можно использовать следующий код:
```javascript
db.users.createIndex({ name: 1 });
```
В данном примере индекс будет создан по возрастанию поля "name" (1 указывает на возрастание, -1 на убывание).
**Поддерживает ли MongoDB транзакции?**
Да, MongoDB начиная с версии 4.0 поддерживает транзакции. Транзакции в MongoDB позволяют группировать несколько операций чтения и записи в одну атомарную операцию. Это гарантирует целостность данных и обеспечивает согласованное состояние базы данных.
**Как подсчитать количество уникальных значений для поля/ключа?**
Для подсчета количества уникальных значений для поля/ключа в MongoDB можно использовать агрегацию с помощью оператора $group. Например, чтобы подсчитать количество уникальных значений для поля "name" в коллекции "users", можно выполнить следующий запрос:
```javascript
db.users.aggregate([
{ $group: { _id: "$name", count: { $sum: 1 } } },
{ $match: { count: { $gt: 1 } } }
]);
```
В результате этого запроса будут выведены только уникальные значения поля "name" и количество повторений для каждого значения.
**Как сортировать документы в MongoDB?**
Для сортировки документов в MongoDB используется метод sort(). Например, чтобы отсортировать документы по полю "age" в коллекции "users" по возрастанию, можно использовать следующий код:
```javascript
db.users.find().sort({ age: 1 });
```
В данном примере документы будут отсортированы по возрастанию поля "age". Чтобы отсортировать по убыванию, нужно указать -1 вместо 1.
**Что такое курсор?**
Курсор (cursor) в MongoDB представляет собой указатель на результаты запроса к коллекции. Когда выполняется запрос, MongoDB возвращает курсор, который можно использовать для итерации по результатам или получения документов по мере необходимости. Курсор позволяет эффективно обрабатывать большие объемы данных без необходимости загрузки их все сразу.
**Как удалить документ из коллекции в MongoDB?**
Для удаления документа из коллекции в MongoDB используется метод deleteOne() или deleteMany(). Например, чтобы удалить документ с определенным условием из коллекции "users", можно использовать следующий код:
```javascript
db.users.deleteOne({ _id: ObjectId("document_id") });
```
В данном примере будет удален документ с указанным _id. Если нужно удалить несколько документов, следует использовать deleteMany().
**Как включить аутентификацию по паролю в MongoDB?**
Чтобы включить аутентификацию по паролю в MongoDB, необходимо выполнить следующие шаги:
Запустите MongoDB с включенной опцией --auth для включения механизма аутентификации.
Создайте пользователя с помощью команды db.createUser(), указав имя пользователя и пароль.
После создания пользователя, MongoDB будет требовать аутентификацию при подключении к базе данных.
**Какие моменты необходимо учитывать при создании схемы в MongoDB?**
При создании схемы в MongoDB следует учитывать следующие моменты:
Денормализация данных: MongoDB не требует жесткой нормализации данных, поэтому можно хранить связанные данные в одной коллекции.
Частые операции чтения или записи: схема должна быть оптимизирована под типичные операции чтения или записи.
Использование индексов: создание подходящих индексов может значительно повысить производительность запросов.
Границы размера документа: необходимо учитывать ограничения по размеру документа в MongoDB при проектировании схемы.
Распределение данных: при необходимости масштабирования и распределения данных можно использовать шардинг и репликацию.
Безопасность: учитывайте меры безопасности при создании схемы, такие как аутентификация и авторизация пользователей.
# SQL
Что такое PostgreSQL?
PostgreSQL - это объектно-реляционная система управления базами данных (СУБД), которая основана на модели клиент-сервер. Она предоставляет мощные средства для хранения и обработки структурированных данных, поддерживает язык SQL и обеспечивает расширенные возможности для разработчиков.
Отношение (таблица)
В контексте реляционной модели данных отношение представляет собой таблицу, состоящую из рядов (строк) и атрибутов (столбцов). Каждая строка отношения содержит данные, а каждый столбец представляет собой атрибут, описывающий свойство данных.
Кортеж (строка)
Кортеж в контексте реляционной модели данных представляет собой строку или запись в отношении (таблице). Он содержит значения атрибутов, соответствующие определенным колонкам (атрибутам) в таблице.
Запрос
Запрос в базе данных представляет собой команду, отправляемую СУБД с целью получения определенных данных из базы данных или выполнения операций изменения данных.
Ключевые слова
Ключевые слова в SQL - это зарезервированные слова, используемые для построения запросов и определения структуры базы данных. Примеры ключевых слов в SQL: SELECT, INSERT, DELETE, CREATE, ALTER, DROP и т. д.
Оператор
Оператор в SQL представляет собой команду или инструкцию, которая выполняет определенные операции с данными. Примеры операторов: SELECT, INSERT, UPDATE, DELETE.
Ограничения NOT NULL
Ограничение NOT NULL в SQL используется для указания, что определенное поле (столбец) не может содержать NULL (пустое) значение. Это гарантирует, что поле всегда будет содержать некоторое значение.
Первичные ключи
Первичный ключ (Primary Key) в SQL - это уникальный идентификатор для каждой записи в таблице. Он обеспечивает уникальность идентификации записей и может состоять из одного или нескольких полей (столбцов).
Внешние ключи
Внешний ключ (Foreign Key) в SQL используется для связывания двух таблиц на основе значения одного поля внешней таблицы, соответствующего значению первичного ключа в основной таблице. Он обеспечивает целостность данных и связи между таблицами.
Составные ключи
Составной ключ (Composite Key) в SQL - это первичный ключ, состоящий из нескольких полей (столбцов) в таблице. Он позволяет уникально идентифицировать записи на основе комбинации значений в этих полях.
Права в PostgreSQL
Права в PostgreSQL определяют уровень доступа и разрешения для пользователей и ролей базы данных. Они определяют, какие операции могут выполнять пользователи, какие объекты они могут изменять и какие данные они могут видеть.
Языки SQL
SQL (Structured Query Language) - это стандартизированный язык программирования, используемый для работы с реляционными базами данных. Он предоставляет синтаксис и команды для создания, изменения и извлечения данных из базы данных.
CREATE/ALTER/DROP
CREATE, ALTER и DROP - это команды SQL, используемые для создания, изменения и удаления объектов базы данных, таких как таблицы, представления, индексы и др.
SELECT/INSERT/DELETE
SELECT, INSERT и DELETE - это команды SQL, используемые для извлечения данных, добавления новых данных и удаления данных соответственно.
REFERENCES
REFERENCES - это ограничение, используемое при создании таблицы, чтобы указать внешний ключ, связывающий таблицу с другой таблицей. Оно определяет ссылочную целостность между таблицами.
GRANT/REVOKE/POLICY
GRANT, REVOKE и POLICY - это команды SQL, используемые для назначения прав доступа, отзыва прав доступа и управления политиками безопасности в базе данных.
Создание схемы
Схема в PostgreSQL представляет собой логическую группировку объектов базы данных, таких как таблицы, представления, функции и др. Создание схемы позволяет организовать объекты базы данных для более удобного управления и разграничения доступа.
Схема public
Схема public в PostgreSQL - это схема по умолчанию, которая создается при создании базы данных. Она содержит некоторые системные таблицы и объекты и может использоваться для создания пользовательских таблиц и других объектов.
Схемы и права
Схемы в PostgreSQL могут использоваться для управления правами доступа к объектам базы данных. Различные схемы могут иметь разные права доступа для разных пользователей или ролей.
Наследование
Наследование в PostgreSQL позволяет создавать иерархическую структуру таблиц, где дочерняя таблица наследует структуру и свойства родительской таблицы. Это позволяет упростить структуру базы данных и обеспечить наследование прав доступа.
Представления
Представление (View) в PostgreSQL - это виртуальная таблица, определенная как результат выполнения запроса. Представление может быть использовано для упрощения сложных запросов, создания виртуальных таблиц или ограничения доступа к данным.
Функции, процедуры
Функции и процедуры в PostgreSQL - это блоки кода, написанные на языке PL/pgSQL или других языках, которые могут принимать параметры, выполнять определенные операции и возвращать результаты.
Предложение FROM
Предложение FROM в SQL используется для указания источника данных, из которого следует извлекать данные в запросе. Оно определяет таблицы или представления, из которых будут выбираться данные.
Предложение WHERE
Предложение WHERE в SQL используется для фильтрации данных, основываясь на определенных условиях. Оно позволяет выбрать только те строки, которые удовлетворяют определенному условию.
Предложения GROUP BY и HAVING
Предложение GROUP BY в SQL используется для группировки данных по одному или нескольким столбцам. Предложение HAVING используется для фильтрации групп, основываясь на условиях.
UNION
UNION в SQL используется для объединения результатов нескольких SELECT-запросов в один результат. Он позволяет объединить строки из разных таблиц или запросов без дублирования.
Сортировка строк (ORDER BY)
ORDER BY в SQL используется для сортировки строк в результирующем наборе данных. Он позволяет указать порядок сортировки (по возрастанию или убыванию) на основе одного или нескольких столбцов.
LIMIT
LIMIT в SQL используется для ограничения количества возвращаемых строк в результирующем наборе данных. Он позволяет указать максимальное количество строк, которые следует вернуть.
Списки VALUES
VALUES в SQL используется для вставки нескольких строк данных в таблицу. Он позволяет указать значения для каждого столбца в виде списка значений.
Типы данных
Типы данных в PostgreSQL определяют характеристики и ограничения для хранения и обработки данных. Примеры типов данных включают INTEGER (целые числа), VARCHAR (строки переменной длины), DATE (даты) и другие.
Логические операторы
Логические операторы в SQL используются для комбинирования условий в запросах. Некоторые из основных логических операторов включают AND, OR и NOT.
LIKE
LIKE в SQL используется для сравнения строк с использованием шаблонов. Он позволяет выполнять поиск по строкам, соответствующим определенному шаблону, используя символы-заменители, такие как % (соответствие любой последовательности символов) и _ (соответствие одному символу).
Агрегатные функции
Агрегатные функции в SQL используются для выполнения операций над группами строк и возвращения единственного результирующего значения. Некоторые из наиболее часто используемых агрегатных функций включают COUNT, SUM, AVG, MIN и MAX.
Выражения подзапросов
Выражения подзапросов в SQL позволяют включать один или несколько запросов внутри других запросов. Они используются для получения данных из одного запроса, который зависит от результатов другого запроса.
Триггерные функции
Триггерные функции в PostgreSQL выполняются автоматически при определенных событиях, таких как вставка, обновление или удаление данных в таблице. Они позволяют автоматизировать выполнение дополнительных операций или проверок при определенных событиях.
Индексы
Индексы в PostgreSQL используются для ускорения поиска и сортировки данных в таблице. Они создаются на одном или нескольких столбцах таблицы и позволяют эффективнее выполнить операции выборки и объединения.
Что такое ACID и зачем он нужен
ACID (Atomicity, Consistency, Isolation, Durability) - это набор принципов, обеспечивающих надежность и целостность транзакций в базе данных. Он гарантирует, что транзакции выполняются безопасно и надежно, а данные остаются целостными.
Что такое в аббревиатуре ACID - A?
В аббревиатуре ACID буква A означает "Atomicity" (атомарность). Этот принцип гарантирует, что транзакция будет выполнена целиком и либо полностью применена, либо полностью отменена.
Что такое в аббревиатуре ACID - C?
В аббревиатуре ACID буква C означает "Consistency" (согласованность). Этот принцип гарантирует, что данные в базе данных остаются в согласованном состоянии после завершения транзакции.
Что такое в аббревиатуре ACID - I?
В аббревиатуре ACID буква I означает "Isolation" (изоляция). Этот принцип гарантирует, что одна транзакция не влияет на результаты других транзакций, выполняемых параллельно.
Что такое в аббревиатуре ACID - D?
В аббревиатуре ACID буква D означает "Durability" (надежность). Этот принцип гарантирует, что после завершения транзакции изменения будут сохранены и доступны даже в случае отказа системы или перезагрузки.
В PostgreSQL есть тип данных с плавающей точкой и предустановленным ограничением в 2 символа после запятой. Зачем этот тип данных нужен и как он называется?
Какие группы операторов выделяются в составе языка SQL?
В составе языка SQL выделяются следующие группы операторов:
Операторы данных (Data Manipulation Language, DML): SELECT, INSERT, UPDATE, DELETE. Они используются для работы с данными в таблицах, включая выборку, вставку, обновление и удаление данных.
Операторы определения данных (Data Definition Language, DDL): CREATE, ALTER, DROP. Они используются для создания, изменения и удаления структуры базы данных и ее объектов, таких как таблицы, индексы, представления и т.д.
Операторы управления данными (Data Control Language, DCL): GRANT, REVOKE. Они используются для управления правами доступа пользователей к объектам базы данных, таким как таблицы, представления и другие.
Операторы управления транзакциями (Transaction Control Language, TCL): COMMIT, ROLLBACK, SAVEPOINT. Они используются для управления транзакциями в базе данных, включая подтверждение (commit), отмену (rollback) и установку точек сохранения (savepoint).
Дайте неформальное определение основных понятий реляционной модели данных: отношение, кортеж, атрибут.
Отношение (таблица): Отношение представляет собой двумерную структуру данных в реляционной модели, которая состоит из строк (кортежей) и столбцов (атрибутов). Каждая таблица имеет уникальное имя и содержит набор записей, которые хранят информацию о сущностях или объектах.
Кортеж (строка): Кортеж представляет собой одну запись или строку в таблице отношения. Он содержит значения атрибутов для определенной сущности или объекта. Каждый кортеж обычно имеет уникальный идентификатор, называемый первичным ключом, чтобы его можно было однозначно идентифицировать в таблице.
Атрибут (столбец): Атрибут представляет собой отдельное поле или столбец в таблице отношения. Он определяет тип данных и содержит конкретные значения для каждого кортежа. Атрибуты описывают свойства или характеристики сущностей, которые хранятся в таблице.
Для чего нужны внешние ключи в реляционных таблицах?
Внешние ключи в реляционных таблицах используются для установления связей или отношений между различными таблицами. Они определяют ссылочную целостность данных и обеспечивают целостность базы данных. Внешний ключ в таблице указывает на первичный ключ или уникальное поле в другой таблице, создавая связь между ними. Это позволяет совместно использовать данные из разных таблиц и обеспечивает согласованность и целостность данных при выполнении операций обновления и удаления.
Какой оператор срабатывает при исполнении SELECT?
Оператор, который срабатывает при исполнении SELECT, называется SELECT-оператор. Он используется для выборки данных из одной или нескольких таблиц базы данных. SELECT-оператор позволяет указать столбцы, которые необходимо выбрать, условия для фильтрации данных, порядок сортировки и другие параметры.
Какой оператор срабатывает при исполнении UPDATE?
Оператор, который срабатывает при исполнении UPDATE, называется UPDATE-оператор. Он используется для изменения данных в таблице базы данных. UPDATE-оператор позволяет обновить значения определенных столбцов в одной или нескольких строках таблицы на основе указанных условий.
Какой уровень изоляции используется по умолчанию?
Уровень изоляции, используемый по умолчанию, может различаться в разных системах управления базами данных (СУБД). Во многих СУБД, таких как PostgreSQL, уровень изоляции "READ COMMITTED" (читаем только зафиксированные данные) является уровнем изоляции по умолчанию. Это означает, что каждая транзакция видит только те данные, которые были зафиксированы на момент начала самой транзакции.
Различие между привилегиями и атрибутами.
Привилегии: Привилегии определяют разрешения или права доступа пользователей к объектам базы данных, таким как таблицы, представления, функции и т.д. Привилегии определяют, какие операции можно выполнять с объектами (например, SELECT, INSERT, UPDATE, DELETE), и кто имеет право выполнять эти операции. Привилегии обычно назначаются администратором базы данных.
Атрибуты: Атрибуты относятся к свойствам или характеристикам объектов базы данных. Например, у таблицы могут быть атрибуты, определяющие ее имя, структуру, типы данных столбцов и т.д. Атрибуты определяют специфические характеристики объектов базы данных, но не связаны с правами доступа или разрешениями.
Зачем нужна схема?
Схема в базе данных используется для организации и структурирования объектов базы данных, таких как таблицы, представления, функции и т.д. Она позволяет группировать связанные объекты и устанавливать различные уровни доступа и права для каждой схемы. С помощью схем можно создавать логические разделения в базе данных, обеспечивая более удобное управление и доступ к объектам.
Почему плохо оставлять суперпользователя в базе данных?
Суперпользователь (обычно называемый "superuser") в базе данных имеет полные привилегии и полный контроль над системой. Оставлять суперпользователя активным в базе данных может представлять опасность для безопасности и целостности данных. Суперпользователь может выполнять любые операции, включая изменение схемы базы данных, удаление таблиц и данных, изменение прав доступа и другие действия, которые могут привести к потере данных или нарушению безопасности. Поэтому рекомендуется создавать и использовать отдельные учетные записи с необходимыми привилегиями для выполнения конкретных задач, а суперпользователя оставлять неактивным или использовать только в особых случаях.
Блокировки строк
Блокировки строк (row-level locking) в базе данных используются для контроля доступа к отдельным строкам данных в таблицах. Они обеспечивают согласованность данных и предотвращают конфликты при одновременном доступе нескольких транзакций к одним и тем же данным. Блокировки строк могут быть различных типов, например, на чтение (shared lock) или на запись (exclusive lock), и могут применяться на уровне всей таблицы или только на отдельные строки данных.
Можно ли записывать и читать данные в PostgreSQL одновременно?
Да, в PostgreSQL можно одновременно выполнять операции записи (INSERT, UPDATE, DELETE) и операции чтения (SELECT) данных. PostgreSQL использует механизмы блокировок и уровней изоляции для обеспечения согласованности и целостности данных при одновременном доступе нескольких транзакций к базе данных. Это позволяет параллельно выполнять операции записи и чтения без несогласованности или потери данных.
Что такое аномалии и где они бывают в PostgreSQL?
Аномалии в контексте баз данных относятся к нежелательным или непредсказуемым результатам при выполнении операций записи, чтения или изменения данных. В PostgreSQL аномалии могут возникать, например, при неправильном использовании транзакций, отсутствии ограничений целостности или при нарушении правил нормализации данных. Некоторые из распространенных аномалий в PostgreSQL включают:
Аномалия потери данных (Data Loss Anomaly): при удалении определенных записей может произойти потеря связанных с ними данных.
Аномалия недопустимого обновления (Update Anomaly): при обновлении определенных данных могут возникать несоответствия или несогласованность с другими данными.
Аномалия некорректного вставления (Insertion Anomaly): при вставке данных могут возникать проблемы с неполнотой или недостоверностью информации.
Аномалия неправильного чтения (Read Anomaly): при одновременном чтении данных разными транзакциями может происходить конфликт и получение неправильных или несогласованных данных.
Какие виды ограничений существуют в PostgreSQL?
В PostgreSQL существует несколько видов ограничений, которые можно применять к таблицам для обеспечения целостности данных:
Ограничение NOT NULL (NOT NULL Constraint): указывает, что определенное поле в таблице не может содержать NULL (пустое значение).
Первичный ключ (Primary Key Constraint): определяет уникальный идентификатор для каждой строки в таблице.
Внешний ключ (Foreign Key Constraint): устанавливает связь между полями в разных таблицах, обеспечивая целостность ссылочных данных.
Ограничение UNIQUE (UNIQUE Constraint): гарантирует, что значения определенного поля в таблице уникальны.
Ограничение CHECK (CHECK Constraint): позволяет определить пользовательское условие, которое должно быть истинным для каждой строки в таблице.
Ограничение EXCLUSION (EXCLUSION Constraint): определяет условие исключения, которое гарантирует отсутствие пересечений значений в заданных полях таблицы.
Различия между NULL, 0 и знаком "пробел"
NULL (пустое значение): обозначает отсутствие значения или неопределенное значение. NULL не является числом или строкой и не может быть сравнено с другими значениями с использованием обычных операторов сравнения. NULL может использоваться, например, для указания отсутствующих данных или неизвестных значений.
0 (ноль): является конкретным числовым значением, обозначающим ноль. 0 может быть сравнено с другими числовыми значениями и использовано в математических операциях.
Знак "пробел" или пустая строка: представляет пустое значение для строки. Это строка без видимых символов, но считается допустимым значением. Знак "пробел" может использоваться, например, для обозначения отсутствующей информации или незаполненных полей.
В таблице есть два числа с типом "integer" - 1 и 2. Какой будет результат при операции 1/2?
При выполнении операции 1/2 в PostgreSQL, по умолчанию используется целочисленное деление для двух чисел типа "integer". В результате такой операции будет получено целочисленное значение равное 0. Если вы хотите получить десятичный результат, вы можете использовать одно из чисел в операции вещественного деления или явно указать приведение типа, например: 1::numeric/2::numeric.
Различия между GROUP BY и HAVING
GROUP BY используется для группировки строк в результате запроса по одному или нескольким столбцам. Он позволяет сгруппировать строки с одинаковыми значениями в указанных столбцах и выполнить агрегатные функции (например, COUNT, SUM, AVG) для каждой группы отдельно.
HAVING используется для фильтрации результатов, полученных после применения GROUP BY. Он позволяет указать условие, которому должны удовлетворять группы для включения в итоговый результат. HAVING работает с агрегатными функциями и фильтрует группы на основе результатов этих функций.
Сколько памяти занимает страница в PostgreSQL?
В PostgreSQL размер страницы в зависимости от конфигурации может составлять 4 килобайта (по умолчанию), 8 килобайт, 16 килобайт или 32 килобайта. Размер страницы определяет минимальный размер доступного блока данных, которым оперирует PostgreSQL при чтении и записи данных на диске. Больший размер страницы может улучшить производительность при работе с большими объемами данных, но требует больше оперативной памяти для кэширования страниц.
Что такое виртуальная транзакция?
Виртуальная транзакция (virtual transaction) в PostgreSQL - это незавершенная или нереальная транзакция, которая не взаимодействует с реальной базой данных, но может быть использована для выполнения определенных операций или проверки целостности данных без фактической фиксации изменений. Виртуальные транзакции полезны для тестирования, проверки или выполнения операций в контролируемой среде, не затрагивая реальные данные.
Что такое HOT-обновление?
HOT-обновление (Heap-Only Tuples) - это механизм в PostgreSQL, который позволяет обновлять строки данных в таблице, не требуя перезаписи всей строки и не создавая новую версию строки. Вместо этого, при выполнении обновления, новые значения просто записываются в свободное место в строке, а старые значения помечаются как удаленные. Это уменьшает количество операций записи на диск и повышает производительность при обновлении данных.
Какие виды очисток существуют?
В PostgreSQL существуют следующие виды очисток:
VACUUM: Очистка (VACUUM) - это процесс, во время которого удаляются устаревшие и удаленные данные из таблицы, освобождаются пространство и обновляются статистические данные. VACUUM выполняется для поддержания порядка и предотвращения роста базы данных.
ANALYZE: Анализ (ANALYZE) - это процесс, во время которого собираются статистические данные о таблицах и индексах. Эти статистические данные используются оптимизатором запросов для выбора оптимальных планов выполнения запросов.
REINDEX: Перестроение индексов (REINDEX) - это процесс, во время которого перестраиваются индексы таблицы для устранения фрагментации и восстановления производительности запросов.
CLUSTER: Кластеризация (CLUSTER) - это процесс физической сортировки данных в таблице, чтобы уменьшить количество чтений с диска и улучшить производительность запросов.
Отличие VACUUM FULL от autovacuum
VACUUM FULL - это команда PostgreSQL, которая выполняет полную очистку и перезапись таблицы. Она пересоздает таблицу и освобождает все занятые пространство от удаленных данных. Однако, VACUUM FULL блокирует таблицу на время выполнения и требует больше системных ресурсов, поэтому он редко используется в реальном производстве.
autovacuum - это автоматический механизм очистки и обслуживания PostgreSQL. Он работает в фоновом режиме и автоматически запускает операции VACUUM и ANALYZE для таблиц в базе данных. Автовакуум основывается на настройках, заданных в конфигурационном файле PostgreSQL, и позволяет поддерживать порядок в базе данных без необходимости ручного вмешательства.
Что такое мертвый кортеж?
Мертвый кортеж (dead tuple) - это строка данных в таблице, которая больше не является видимой для транзакций и может быть очищена (удалена) в процессе выполнения операции VACUUM. Мертвые кортежи возникают, когда строки обновляются или удаляются, их версии сохраняются для обеспечения изоляции транзакций и возможности отката изменений. VACUUM удаляет мертвые кортежи и освобождает пространство, занимаемое ими.
Что такое временные таблицы?
Временные таблицы (temporary tables) - это таблицы, которые создаются и используются в рамках текущей сессии или текущей транзакции и автоматически удаляются после завершения сессии или транзакции. Временные таблицы полезны, когда необходимо сохранить промежуточные результаты или выполнить операции над временными данными. Они обеспечивают изоляцию данных между различными сессиями и минимизируют возможные конфликты имен с постоянными таблицами.
Чем отличается атомарность при проектировании баз данных от атомарности при использовании базы данных?
Атомарность при проектировании баз данных относится к принципу, согласно которому операции базы данных должны быть выполнены целиком и либо успешно завершены, либо полностью откатиться в случае ошибки. В проектировании баз данных атомарность обычно реализуется с использованием транзакций, которые гарантируют, что все операции в рамках транзакции будут выполнены либо не выполнены вообще.
Атомарность при использовании базы данных относится к свойству транзакций, которое обеспечивает, что все операции в рамках транзакции будут выполнены целиком и атомарно, то есть либо все операции успешно завершатся, либо ни одна из них не будет применена. Это гарантирует целостность данных и предотвращает возникновение непоследовательных состояний в базе данных.
Оба аспекта атомарности (при проектировании и при использовании) важны для обеспечения надежности и целостности базы данных. Атомарность при проектировании баз данных определяется структурой и логикой базы данных, в то время как атомарность при использовании базы данных обеспечивается системой управления базой данных (например, PostgreSQL) через механизмы транзакций.
Что такое потенциальный ключ?
Потенциальный ключ - это атрибут или комбинация атрибутов в реляционной модели данных, которая может однозначно идентифицировать каждую запись (кортеж) в таблице. Он обладает уникальностью и минимальность, то есть ни один подмножество атрибутов не может быть ключом. Потенциальный ключ может стать основой для определения первичного ключа.
В каком случае надо изменять уровень изоляции с "по умолчанию" на более низкий?
Уровень изоляции в базе данных определяет, каким образом транзакции видят изменения, сделанные другими транзакциями. Обычно нет необходимости изменять уровень изоляции с "по умолчанию" (который часто соответствует уровню изоляции READ COMMITTED). Однако в некоторых случаях может потребоваться установить более низкий уровень изоляции, чтобы получить доступ к неподтвержденным данным или предотвратить блокировки, если вы уверены в правильности такого решения.
На каких уровнях изоляции в PostgreSQL возможно грязное чтение?
В PostgreSQL грязное чтение (dirty read) возможно на уровне изоляции READ UNCOMMITTED (не подтвержденное чтение). На этом уровне транзакция может видеть изменения, сделанные другими транзакциями, даже если эти изменения не были подтверждены (зафиксированы). Грязное чтение может приводить к непредсказуемым результатам и несогласованности данных.
В каких случаях применение индексов в PostgreSQL будет бесполезным?
Применение индексов может быть бесполезным в следующих случаях:
Когда таблица содержит очень мало данных, и производительность запросов не является проблемой.
Когда структура таблицы и типы запросов не позволяют эффективно использовать индексы.
Когда данные в таблице часто изменяются, а обновление индексов может привести к значительным накладным расходам.
Когда запросы выполняются с использованием операторов, которые не могут использовать индексы, например, при использовании функций или операторов сравнения, которые не поддерживают индексы.
При наследовании полномочий в PostgreSQL, что произойдет с наследником наследника, если у родителя забрать права и почему?
При наследовании полномочий в PostgreSQL, права доступа передаются от родительской таблицы наследующей таблице. Если у родительской таблицы забрать права, то наследующие таблицы (включая наследников наследников) также потеряют эти права. Это происходит потому, что права доступа наследуются по иерархии наследования таблиц, и если права отсутствуют в родительской таблице, они не могут быть унаследованы на более низких уровнях.
В аббревиатуре ACID последняя буква переводится как "устойчивость". Почему это некорректно и как лучше назвать?
В аббревиатуре ACID последняя буква "D" переводится как "долговечность" (durability), а не "устойчивость". Долговечность обозначает, что изменения, сделанные в базе данных в рамках успешно завершенной транзакции, остаются сохраненными даже в случае отказа системы или перезагрузки. Это важное свойство базы данных, которое обеспечивает сохранность данных в долгосрочной перспективе.
В таблице есть два числа с типом "bigint" - 1 и 2. Какой будет результат при операции 1/2?
Результат операции 1/2 будет целочисленным, так как оба числа имеют тип "bigint". В PostgreSQL операция деления целых чисел возвращает целочисленное значение, а не десятичную дробь. Поэтому результат будет 0.
В чем разница между COUNT () и COUNT (Столбец)?
COUNT() возвращает общее количество строк в таблице, включая строки с NULL значениями во всех столбцах.
COUNT(столбец) возвращает количество непустых значений в указанном столбце. NULL значения в этом столбце не учитываются.
Что такое XACT?
XACT - это сокращение от "транзакция" (transaction) в PostgreSQL. Транзакция представляет собой последовательность операций базы данных, которая выполняется как единое целое. Транзакция обеспечивает атомарность, согласованность, изолированность и долговечность изменений в базе данных.
Какие бывают статусы версий строки?
Статус версий строки в PostgreSQL может быть следующим:
"Alive" (живая) - активная версия строки, существующая в базе данных.
"Deleted" (удалена) - помеченная для удаления версия строки, которая еще не была физически удалена.
"Expired" (истекшая) - версия строки, которая была удалена и подлежит автоматической очистке в процессе VACUUM.
"Frozen" (замороженная) - версия строки, которая не может быть удалена или изменена, так как является старее уровня изоляции транзакции.
Чем статус dead отличается от deadlock?
Статус "dead" (мертвый) относится к строкам данных в PostgreSQL, которые были помечены для удаления и ожидают очистки в процессе VACUUM. Эти строки не видны для обычных операций чтения и являются остаточными после удаления или обновления данных.
Deadlock (взаимная блокировка) - это ситуация, когда две или более транзакции взаимно блокируют друг друга, ожидая освобождения ресурсов, удерживаемых другими транзакциями. В результате транзакции не могут продолжиться и ожидают, пока не будет разрешен конфликт.
Что произойдет при попытке изменить одну и ту же строку разными транзакциями при разных уровнях изоляции?
При попытке изменить одну и ту же строку разными транзакциями при разных уровнях изоляции может произойти следующее:
При более низком уровне изоляции (например, READ UNCOMMITTED) транзакция может прочитать изменения, сделанные другой транзакцией, но может также привести к грязному чтению или неповторяемому чтению.
При более высоком уровне изоляции (например, REPEATABLE READ или SERIALIZABLE) одна из транзакций может быть заблокирована до тех пор, пока другая транзакция не завершит свои изменения.
В случае конфликтов между транзакциями, могут возникнуть блокировки, дедлоки или другие проблемы, которые потребуют разрешения, например, через откат или ожидание освобождения ресурсов.
Что произойдет, если во время deadlock сделать rollback?
При выполнении операции rollback во время deadlock, транзакция, вызвавшая deadlock, будет отменена (rollback), а все изменения, сделанные этой транзакцией, будут откатаны. Это позволит разблокировать ресурсы и позволит другим транзакциям продолжить свое выполнение.
Добавятся ли новые версии строк индексов, если были добавлены новые версии строк, в которых не менялся ключ, по которому строится индекс?
В PostgreSQL новые версии строк индексов не будут добавляться, если были добавлены новые версии строк, в которых не менялся ключ, по которому строится индекс. Индекс создается для отслеживания изменений значений ключевых столбцов в таблице. Если ключевые значения не меняются, новые версии строк не будут добавляться в индекс.
Как можно оживить мертвый кортеж?
В PostgreSQL можно оживить (реанимировать) мертвый кортеж (мертвую строку) путем выполнения операции VACUUM. VACUUM - это процесс, который очищает удаленные строки и освобождает пространство в таблицах базы данных. При выполнении VACUUM мертвые кортежи могут быть физически удалены, и пространство, которое они занимали, может быть освобождено для будущего использования.
Что такое одноразовые данные?
Одноразовые данные (temporary data) - это данные, которые создаются и используются в пределах одной сессии или временной таблицы в PostgreSQL. Они имеют временный характер и существуют только во время выполнения конкретной операции или сеанса работы с базой данных. Одноразовые данные могут быть использованы для временного хранения промежуточных результатов, временных таблиц или других временных объектов, которые не требуют долгосрочного сохранения.
Что быстрее работает: UPDATE или INSERT?
Это зависит от конкретной ситуации и структуры таблицы. В целом, операция INSERT может быть быстрее, чем операция UPDATE, поскольку INSERT добавляет новые данные в таблицу, в то время как UPDATE обновляет существующие данные. Однако, если таблица имеет индексы или триггеры, операция UPDATE может быть более сложной и медленнее, чем операция INSERT. Эффективность операций зависит от множества факторов, включая объем данных, наличие индексов, структуру запроса и конфигурацию базы данных.
Статус "dead" (мертвый) и статус "unused" (неиспользуемый) - это два различных состояния, которые могут быть применены к строкам данных в PostgreSQL:
Статус "dead" (мертвый): Строки данных, помеченные как "dead", относятся к удаленным версиям строк, которые остались после операций удаления или обновления данных. Строки с этим статусом не видны для обычных операций чтения, и они ожидают физической очистки в процессе выполнения операции VACUUM. Очистка мертвых строк позволяет освободить пространство, занимаемое удаленными данными, и повысить производительность базы данных.
Статус "unused" (неиспользуемый): Строки данных, помеченные как "unused", относятся к строкам, которые были вставлены в таблицу, но не были никогда использованы (не было обращений к ним). Это может произойти, например, если строка была вставлена, а затем удалена или если вставка не была завершена или отменена. Строки с этим статусом также не видны для обычных операций чтения, и они могут быть очищены и удалены в процессе выполнения операции VACUUM.
Важно отметить, что статус "dead" относится к удаленным версиям активных строк данных, тогда как статус "unused" относится к строкам, которые никогда не использовались в базе данных.