Pull to refresh

Comments 22

А какой вообще смысл от schemaless базы, если классы моделей все равно ограничивают набор полей?..

Поработав с Mongo через Java, я склоняюсь к мнению что либо должен быть ORM фреймворк, либо надо оперировать голыми DBObject'ами, которые возвращает база без заведения отдельных классов моделей. Безусловно, второй случай менее строг и это может быть минусом. Но зато он предоставляет хорошую гибкость.

В вашем случае задолбаешься руками писать копирование значений из объекта, возвращаемого базой, в объект модели.
Здесь недавно писали про Morphia — ORM для MongoDB.
В данном случае, мне кажется, удобно выводить информацию на странице, имея объект с полями.
В случае изменения задачи надо менять только классы моделей. В SQL БД надо менять схему с downtime и шансом что-нибудь сломать в процессе.

«оперировать голыми DBObject'ами» лишает Вас гибкости в принципе. Если про БД знают все уровни приложения впроть до шаблонов страниц мельчайшее изменение в требованиях порождает непрдсказуемое количество геморроя.
bq. В SQL БД надо менять схему с downtime
Почему с downtime-то? ALTER TABLE ADD COLUMN
А если нужно not null поле добавить? Придется делать как минимум 2 релиза. Перед первым только добавления столбца. Перед вторым установка not null.
С MongoDB будет такая же возня. Так зачем платить больше, как говорится?
Что лочит таблицу. При маленькой таблице не проблема. На больших таблицах — большая проблема. Friends feed решил проблему по-своему
Эту проблему и MongoDB не лечит.
Наверное. Я и не утверждал, что MongoDB лечит эту проблему, просто поразило незнание работы ALTER TABLE.
Про репликацию не забываем- мастер-слейв не умеет альтер делать.
А какой вообще смысл от schemaless базы, если классы моделей все равно ограничивают набор полей?

Ну смысл-то в быстродействии. Т.е. быстродействии базы.

Но я согласен, что ORM должен быть. Без него конечно в 2011 году тяжеловато, кода и так много в java лишнего пишется.
Кстати, а можно ли при при insert узнать внутренний id, присвоенный документу?
Здесь есть целый раздел документации по внутренним id и индексам.
Также нашел, что после update или insert можно вызывать getlasterror, при этом «An „upserted“ field will contain the new _id value if an insert is performed».
Обычно если id и правда интересен логике приложения хорошей идеей будет его генерировать самому.
Интересны комментарий. Поясните?
Ну если он несёт какой-то смысл, то его можно сгенерировать самому, сохраняя этот самый смысл. Это позволяет например подготовить все данные для нескольких связанных операций и выполнять их параллельно, не дожидаясь выполнения одной. Кроме того сгенерированный id скорее всего будет компактнее и читабельнее (ObjectId имеет противную особенность, что уникальные внутри коллекции знаки находятся где-то в середине).
Значение для _id, если оно не задано, генерится при сохранении объекта драйвером доступа к БД. Как при этом получаются уникальные значения можно почитать в доке или посмотреть сорцы драйвера.

Так что, после сохранения объекта в базу, можно просто прочесть его поле _id, в которое будет записан индификатор.
И как всегда описан только «нормальный» режим работы. А ведь в java-коннекторе для MongoDB самое главное это обработка исключений. Так вот, этот java-коннектор обожает кидать RuntimeException'ы из самых неожиданных мест. А если вы, например, работаете с базой асинхронно из выделенных потоков, то неожиданные экспешены, убивающие треды в пуле, вам ни к чему.
А зачем тут конверсии в/из DBObject? Ява что сама не умеет сериализовывать классы?
В базе все хранится в парах ключ-значение, а тут необходимо заполнить поля объекта Book данными из базы. Какое решение вы предлагаете?
Ну, я пишу примерно вот так:

using (var srv = GetServer())
{
var coll = srv.GetCollection();
Book b = new Book() { ... };
coll.Insert(b);
}
Мне теоритически интересна возможность использования noSQL хранилиш, для хранения настроек пользователя на серврер приложений к примеру ну и много чего еще.

Мне вот правда интересно пару ньансов, возможно кто-то может прояснить:
-0- А что если положить в noSQL хранилише несколько миллионов записей?? Насколько эффективно будет извлекать запись по некоему ключу ??

-1- В кластеризованой среде мне необходим отдельный сервре для устаноки на него noSQL базы, не так ли ??

Sign up to leave a comment.

Articles