$ref - использование и контроль (непонятка)

32 views
Skip to first unread message

Максим Белов

unread,
Mar 4, 2014, 12:00:31 AM3/4/14
to mongodb-us...@googlegroups.com
Приветствую участников группы!

Имеется еще один вопрос из серии "непонятка" :-).

Такая структура C#
public class Employee : EntityBase
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<MongoDBRef> Depatments { get; set; }
    }

создает следующий документ
/* 0 */
{
  "_id" : ObjectId("531558cf6a2f4f00d437f6bb"),
  "FirstName" : "Sam",
  "LastName" : "Smit",
  "Depatments" : [{
      "$ref" : "Depatments",
      "$id" : ObjectId("531558cf6a2f4f00d437f6ba")
    }]
}
Вопрос заключается в том, как контролировать целостность ссылок на другие коллекции документов?
Насколько я понял, средствами СУБД этого не сделать,
а перебирать перед удаление все коллекции  на наличие этой ссылки, кажется не совсем здраво.
Подскажите, возможно есть какой- то рецепт на такие ситуации?

Serge Matveenko

unread,
Mar 4, 2014, 4:07:03 AM3/4/14
to mongodb-us...@googlegroups.com
Ну, а что значит "перебирать"? Можно же построить соответствующий
запрос. Например, с помощью оператора
http://docs.mongodb.org/manual/reference/operator/update/pull/#up._S_pull

Удаление ссылок -- один запрос. Удаление объекта -- один запрос.

Кстати, про использвоание ссылок:
http://docs.mongodb.org/manual/reference/database-references/
"Unless you have a compelling reason for using a DBRef, use manual references."
> --
> You received this message because you are subscribed to the Google Groups
> "MongoDB по-русски" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mongodb-user-rus...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.



--
Serge Matveenko
mailto: se...@matveenko.ru
github: http://lnkfy.com/1
linkedin: http://lnkfy.com/S

Пародуй.рф -- http://www.parodui.ru/
Специализированный магазин электронных сигарет
СПб, Ленинский проспект 79 корп. 3, +7 (812) 951-25-24

Максим Белов

unread,
Mar 4, 2014, 5:41:17 AM3/4/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
Приветствую Сергей!

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

В SQL СУБД этот вопрос решается просто, тут пока не понятно (для меня по-крайней мере).
Или можно использовать функции для реализации такого рода сценария?

Мышление пока отказывается понимать, что таблицы на самом деле нет :-)

вторник, 4 марта 2014 г., 13:07:03 UTC+4 пользователь lig написал:

Serge Matveenko

unread,
Mar 4, 2014, 5:54:21 AM3/4/14
to Максим Белов, mongodb-us...@googlegroups.com
На самом деле СУ на вашей стороне а БД на стороне Mongo. Т.е. вы
должны посмотреть есть ли ссылки и запретить удалять. Можно навешать
абстракции для этого и обращаться к методам ваших объектов, которые
внутри будут проверять что надо и бросаться, например, исключениями.

Я использовал вот такую схемку для иллюстрации именно этой особенности
https://speakerdeck.com/lig/mongoengine-noorm-for-nosql?slide=3

Собственно в докладе рассказывалось об абстракции, подобная которой
нужна вам. Здесь речь идет о Python, но, думаю, подобный слой есть и
для C#.
>> > email to mongodb-user-rus...@googlegroups.com.

trashnroll

unread,
Mar 4, 2014, 6:03:55 AM3/4/14
to mongodb-us...@googlegroups.com
Ну, автоматического контроля целостности, констрейнтов и т.п. от монго вы не получите, специфика данного инструмента несколько иная. Эти и другие вещи из мира реляционных бд здесь можно так или иначе реализовать вручную, но не факт, что вам это действительно нужно, все зависит от вашего кейса.

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

Навскидку, горка абстрактных вариантов для монго, все со своими плюсами и минусами, выбирайте наиболее подходящий для вашей ситуации:

1. перед удалением документа проверять, существуют ли ссылки на него.
2. не удалять документ, а отмечать его, как удаленный.
3. держать в документе счетчик (ну или перечень) ссылающихся на него документов, поддерживать его актуальность.
4. держать в документе вместо ссылок копии других документов.
5. то же самое, но уже не копии, а единственные экземпляры.

Ну и, да, на официальном сайте монгодб есть доки с описанием основных подходов к дизайну моделей данных, почитайте их, если вы еще этого не сделали.



4 марта 2014 г., 14:41 пользователь Максим Белов <maxraim...@gmail.com> написал:
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user-rus...@googlegroups.com.

Serge Matveenko

unread,
Mar 4, 2014, 6:52:29 AM3/4/14
to mongodb-us...@googlegroups.com
2014-03-04 15:03 GMT+04:00 trashnroll <trash...@gmail.com>:
> Ну и, да, на официальном сайте монгодб есть доки с описанием основных
> подходов к дизайну моделей данных, почитайте их, если вы еще этого не
> сделали.

Можно, например, посмотреть тут что-нибудь, чтобы проянить непонятные
моменты http://www.mongodb.com/presentations

Максим Белов

unread,
Mar 4, 2014, 8:33:21 AM3/4/14
to mongodb-us...@googlegroups.com, s...@matveenko.ru
Спасибо всем за ответы, вроде мысли начали двигаться в правильном русле.

вторник, 4 марта 2014 г., 15:52:29 UTC+4 пользователь lig написал:
Reply all
Reply to author
Forward
0 new messages