2012-05-15 3 views
0

Во-первых, я бы хотел сказать, что я действительно люблю NoSQL & MongoDB, но у меня есть некоторые серьезные проблемы с его аспектом schema-less.Есть ли способ заставить схему соблюдаться?

Предположим, у меня есть 2 стола. Сотрудники и Фильмы.

И ... У меня очень глупый data layer/framework, который иногда любит сохранять объекты в неправильных таблицах.

Таким образом, один день, Movie сохраняется в таблице Employees. Например:

> use mongoTests; 
switched to db mongoTests 
> db.employees.insert({ name : "Max Power", sex : "Male" }); 
> db.employees.find(); 
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" } 
> db.employees.insert({ title : "Fight Club", actors : [{ name : "Brad Pitt" }, { name : "Edward Norton" }]}); 
> db.employees.find(); 
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" } 
{ "_id" : ObjectId("4fb25db834a31eb591b"), "title" : "Fight Club", "actors" : [ { "name" : "Brad Pitt" }, { "name" : "Edward Norton" } ] } 

Это ОЧЕНЬ неправильно.

Давайте переключать контекст, думать о Фильмы и Кредитные карты (по какой-либо причине, в связи с этим кредитные карты будут храниться в открытом виде в БД). Это SUPER WRONG?

  1. код, вероятно, взорваться, потому что он пытается использовать структуру объекта и получает другую совершенно неизвестную структуру.

  2. Хуже всего, код действительно работает, и посетители веб-магазина действительно видят информацию о кредитных картах в списке «Прокат фильма».

Есть ли что-нибудь, встроенное, которое предотвратило бы такую ​​угрозу когда-либо? Как какой-то способ «заставить» схему соблюдать только для некоторых таблиц?

Или есть ли способ заставить MongoDB сделать схему обязательной? (Невозможно создать новые поля в таблице и т. Д.)

EDIT: Для тех, кто думает, что я троллинг, я действительно нет, это важный вопрос для меня и моей команды, потому что это большое решение, будем ли мы использовать NoSQL.

Спасибо и хорошо провести время.

+1

Наверняка одно дело - исправить ошибки в слое данных. – Pointy

+0

@Pointy: Конечно, но это не устраняет проблему в ее корнях. Давайте учтем, что разработчик может не иметь доступа к исправлению ошибок слоя данных. Благодарим за комментирование. – TomShreds

+0

Другое дело не в том, чтобы хранить личные данные в том же db, что и для «обычных» данных (я бы предложил второй сервер тоже ...). Затем переключитесь на другую БД, если важна (какая-либо) безопасность ... –

ответ

2

Аспект без схемы является одним из основных положительных факторов.

БД со схемой не полностью удаляет этот вид проблемы - например, может возникнуть ошибка в системе, использующей РСУБД, которая помещает неверные данные в неправильное поле/таблицу.

ИМХО, большая проблема была бы такой, как эта ошибка могла пройти через dev, тестирование и выход на производство ?!

Сказав это, вы можете настроить процесс, который проверяет «схему» документов внутри коллекции (например, посмотрите на недавно добавленные документы, проверьте, есть ли у них поля, которые вы ожидаете увидеть там) - затем отметьте для расследования. Существует такой инструмент (узел.JS) здесь (я думаю, я никогда не использовал его):

http://dhendo.github.com/node-mongodb-schema-validator/

Edit:
Для тех, кто найти этот вопрос в будущем, так что ссылка на мой комментарий не идти упускать из виду, здесь есть джира для такого рода вещей: http://jira.mongodb.org/browse/SERVER-3536

+0

«БД со схемой не полностью удаляет эту проблему - например, может быть ошибка в системе, которая использует СУРБД, которая помещает неверные данные в неправильное поле/таблицу». Да, но, пытаясь добавить неизвестное поле в таблицу, вы получите ошибку «X-поле не существует», а не вставляете ее. – TomShreds

+0

Я просто нахожу, что это глупо, что разработчику нужно не допустить такого рода вещи. Должна быть какая-то «схема силовой схемы» или что-то еще ... Спасибо за ответ! – TomShreds

+1

@TomShreds - Я слышал, что вы говорите, да, это в меньшей степени. Я не думаю, что это глупо, ведь - mongodb дает совершенно другой вариант для РСУБД, решая другие вещи по-разному и фокусируясь на этих различиях. Этот вопрос о jira для mongodb может представлять интерес в отношении этой области ... https://jira.mongodb.org/browse/SERVER-3536 – AdaTheDev

Смежные вопросы