Валидация JSON Schema для столбцов

Источник: «JSON Schema validation for columns»
Расширение традиционной схемы базы данных столбцами NoSQL JSON позволяет сделать схему более понятной. При её использовании база данных будет гарантировать, что все JSON-данные, хранящиеся в столбце, являются валидным JSON. Но можно ли также гарантировать наличие определённых свойств в JSON-документе?

Теперь, когда в вашей базе данных появился JSON-столбец, возникает соблазн хранить данные, которые сложно моделировать, в JSON-столбце. Возможно, вы не захотите отказываться от безопасности определённой схемы, которая так сильно упрощает код вашего приложения. Действительно, JSON-столбец будет проверяться на структурную валидность, на соответствие стандарту SQL. Но можно также получить безопасность схемы-определения для JSON-столбцов, выполнив проверку по правилам JSON Schema.

Использование

MySQL

ALTER TABLE products ADD CONSTRAINT CHECK(
JSON_SCHEMA_VALID(
'{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"additionalProperties": false
}'
,
attributes
)
);

INSERT INTO products (..., attributes) VALUES (..., '{}');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":[] }');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":["test"] }');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":[2] }');
-- ERROR: Check constraint 'products_chk_1' is violated.

PostgreSQL (требуется postgres-json-schema)

ALTER TABLE products ADD CONSTRAINT data_is_valid CHECK(
validate_json_schema(
'{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"additionalProperties": false
}'
,
attributes
)
);

INSERT INTO products (..., attributes) VALUES (..., '{}');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":[] }');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":["test"] }');
-- Result: OK
INSERT INTO products (..., attributes) VALUES (..., '{ "tags":[2] }');
-- ERROR: new row for relation "products" violates check constraint "data_is_valid"
-- DETAIL: Failing row contains ({"tags": [2]}).

Подробное объяснение

JSON-столбцы доступны во всех современных базах данных с автоматической проверкой валидности структурного JSON и сохранением в эффективном для хранения виде. Но поскольку данные, которые сложно хранить в реляционной модели, теперь сохраняются в JSON-столбцах, возникает новый набор проблем. Давно известно, что бессхемная NoSQL-база данных просто переносит схему в приложение. Схема и множество её версий должны управляться во многих местах приложения. Но мы хотим избежать повторения этой ошибки при использовании JSON-столбцов.

Проблема проверки (сложного) JSON-документа на соответствие определённой модели решается уже давно. Стандарт JSON Schema позволяет описывать свойства и типы данных, что даёт эффективное решение для валидации JSON-документа. Раньше этот процесс выполнялся в приложении, но нет причин, по которым вы не можете или не должны делать это в базе данных. Ведь если вам потребуется изменить что-либо в базе данных вручную, логика валидации вашего приложения не будет использована. Добавление валидации JSON Schema к столбцам JSON объединяет возможности NoSQL и реляционной базы данных:

Дополнительные ресурсы

Дополнительные материалы

Предыдущая Статья

Понять Композицию в JavaScript раз и навсегда

Следующая Статья

Шпаргалка по кодировке символов для JavaScript разработчиков