Во-первых, я бы хотел сказать, что я действительно люблю 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?
код, вероятно, взорваться, потому что он пытается использовать структуру объекта и получает другую совершенно неизвестную структуру.
Хуже всего, код действительно работает, и посетители веб-магазина действительно видят информацию о кредитных картах в списке «Прокат фильма».
Есть ли что-нибудь, встроенное, которое предотвратило бы такую угрозу когда-либо? Как какой-то способ «заставить» схему соблюдать только для некоторых таблиц?
Или есть ли способ заставить MongoDB сделать схему обязательной? (Невозможно создать новые поля в таблице и т. Д.)
EDIT: Для тех, кто думает, что я троллинг, я действительно нет, это важный вопрос для меня и моей команды, потому что это большое решение, будем ли мы использовать NoSQL.
Спасибо и хорошо провести время.
Наверняка одно дело - исправить ошибки в слое данных. – Pointy
@Pointy: Конечно, но это не устраняет проблему в ее корнях. Давайте учтем, что разработчик может не иметь доступа к исправлению ошибок слоя данных. Благодарим за комментирование. – TomShreds
Другое дело не в том, чтобы хранить личные данные в том же db, что и для «обычных» данных (я бы предложил второй сервер тоже ...). Затем переключитесь на другую БД, если важна (какая-либо) безопасность ... –