Приложение CouchDB для блогов - PullRequest
4 голосов
/ 27 марта 2011

Я прочитал «CouchDB - полное руководство» и много статей, найденных в Интернете.Я понял, как работает Couch, но некоторые вопросы все еще находятся в моей голове.

Предположим, вы работаете над простым приложением блога: на странице поста я бы хотел показать данные поста и данные автора.Так что я думаю, что все должно быть в одном документе.Хорошо.Если мне нужно показать только данные автора на одной странице, я могу сделать это с видом.Хорошо.

Но если автор обновит свои данные, мне нужно обновить каждый документ, где появляется автор?Или я не прав?

Мне бы очень хотелось понять эту логику.

Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 27 марта 2011

Некоторую информацию можно оставить в том же документе, и в большинстве случаев она будет работать нормально.

{
    "title": "Blog Article Title",
    "content": "... blah blah blah ...",
    "author": {
        "name": "someguy",
        "email": "someguy@foo.bar"
    },
    "type": "post"
}

В других случаях вы можете просто использовать _id другого документа для созданияссылка между двумя документами.

{
    "_id": "...",
    "title": "Blog Article Title",
    "content": "... blah blah blah ...",
    "author": "someguy",
    "type": "post"
}

{
    "_id": "someguy",
    "name": "Some Guy",
    "email": "someguy@foo.bar",
    "type": "author"
}

На первый взгляд, вам потребуется 2 отдельных запроса для извлечения обеих сущностей.Тем не менее, есть хороший маленький трюк, который могут отображать запросы представления.

function (doc) {
    if (doc.type === "post") {
        emit([doc.title, 0], null);                // output the main post
        emit([doc.title, 1], { _id: doc.author }); // output the author
    }
}

Ваше представление выведет этот результат: (обратите внимание, как представление сортируется)

{ ...
    "rows": [
        {
            "key": ["Blog Article Title", 0],
            "value": null
        },
        {
            "key": ["Blog Article Title", 1],
            "value": { "_id": "someguy" }
        }
    ]
}

Это не всеэто очень полезно, но если вы добавите include_docs=true к URL-адресу просмотра, вы получите такой результат:

{ ...
    "rows": [
        {
            "key": ["Blog Article Title", 0],
            "value": null,
            "doc": {
                "_id": "...",
                "title": "Blog Article Title",
                "content": "... blah blah blah ...",
                "author": "someguy",
                "type": "post"
            },
        },
        {
            "key": ["Blog Article Title", 1],
            "value": { "_id": "someguy" },
            "doc": {
                "_id": "someguy",
                "name": "Some Guy",
                "email": "someguy@foo.bar",
                "type": "author"
            }
        }
    ]
}

Теперь обе сущности включены в 1 запрос.:)

Проверьте эту статью для получения дополнительной информации об отношениях сущностей в CouchDB.

3 голосов
/ 27 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...