Разделы портала

Онлайн-тренинги

.
Тестирование нереляционных баз данных
13.03.2020 01:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи
Перевод: Ольга Алифанова

В прошлый раз я разбирала запросы к реляционным базам данных, необходимые для тестирования. Сегодня я рассмотрю нереляционные базы данных, расскажу, чем они отличаются от реляционных, и мы обсудим, как создавать к ним запросы в процессе тестирования. Нереляционные базы данных, например, MongoDB и DynamoDB, иногда называются базами данных "без SQL", и их популярность стремительно нарастает.

Основное различие между реляционными и нереляционными базами данных в том, что реляционные БД используют таблицы для хранения данных, а нереляционные используют документы. Эти документы часто имеют формат JSON. Давайте посмотрим, как записи из таблицы Contacts (см. статью про реляционные БД) будут выглядеть, будучи перенесенными в нереляционную базу.


{
contactId: "10000",
firstName: "Prunella",
lastName: "Prunewhip",
email: " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ",
phone: "8005551000",
city: "Phoenix",
state: "AZ"
}
{
contactId: "10001",
firstName: "Joe",
lastName: "Schmoe",
email: " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ",
state: "RI",
}

Заметьте, что у Джо нет значений для телефона или города, и поэтому они не включены в документ. Тут есть разница с реляционными базами, которые требуют значений для каждого поля. Вместо того, чтобы вставлять значение NULL для телефона и города, как в SQL-таблице, эти поля просто не приводятся.

Другое ключевое различие между реляционными и нереляционными БД в возможности добавления в таблицу нового поля без добавления его в каждый документ. Допустим, мы добавляем в таблицу запись, и мы хотим, чтобы она содержала имя супруга/и. После добавления этой записи она будет выглядеть так:

{
contactId: "10002",
firstName: "Amy",
lastName: "Smith",
email: " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ",
phone: "8885551001",
city: "Boise",
state: "ID",
spouse: "John"
}

Оригинальные записи, 10000 и 10001, не должны иметь значение в поле "имя супруга". В реляционной БД при добавлении нового поля меняется вся схема таблицы, и у Прюнеллы и Джо появятся значения имен супругов (или NULL).

В нереляционных БД нельзя пользоваться объединениями табличных данных, как мы делали в прошлый раз. Каждая запись должна восприниматься как абсолютно самостоятельный документ, и можно создавать запросы для поиска нужных документов. Вид языка запросов зависит от типа используемой базы данных. Примеры ниже приведены для языка запросов MongoDB, основанного на JavaScript, и запрашивают вышеперечисленные документы.

db.contacts.find() – такой запрос вернет все контакты в таблице.

db.contacts.find( { contactId: "10001" } ) – такой вопрос вернет документ с данными Джо.

Чтобы ответы было проще читать, можно добавить команду .pretty() – тогда результат будет приведен к формату JSON, а не выдаваться единой строкой значений.

Вы также можете запросить конкретное поле каждого документа.

db.contacts.find({}, {firstName:1, _id:0}) – такой запрос вернет имена для каждого контакта.

Так как документы в нереляционной БД имеют JSON-структуру, можно создавать документы с массивами. К примеру, в нашей таблице Contacts может находиться документ с перечислением любимой еды каждого контакта:

{
contactId: "10000",
firstName: "Prunella",
lastName: "Prunewhip",
email: " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ",
phone: "8005551000",
city: "Phoenix",
state: "AZ",
foods: [ "pizza", "ice cream" ]
}

Массивы даже могут содержать объекты:

{
contactId: "10001",
firstName: "Joe",
lastName: "Schmoe",
email: " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ",
state: "RI",
pets: [ { type: "dog", name: "fido" }, { type: "cat", name: "fluffy" } ]
}

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

Чтобы запросить контакты всех владельцев кошек, можно просто сделать так:

db.contacts.find( {"pets.type":"cat"} )

Чтобы запросить контакты всех владельцев кошек по имени Флаффи, так:

db.contacts.find( {$and: [{"pets.type":"cat"},{"pets.name":"fluffy"}]} )

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

Обсудить в форуме