2016-06-03 3 views
0

Я хочу сохранить некоторые книги в базе данных. Меня интересует couchdb, потому что он может обслуживать контент напрямую с html-форматированием.Как хранить книги в couchdb?

Размер книги, который будет храниться, варьируется от 500КБ до 50 МБ или более. В каждой книге также будет указано содержание, автор, издатель и т. Д. Книги будут сгруппированы по их категории. И некоторые большие книги - это , разделенные на несколько томов.

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

Теперь я сомневаюсь в дизайне. Я придумал два дизайна с это вид карты функция:

  1. магазин каждую книгу в виде единого документа:

    Конструкция выглядеть следующим образом:

    { 
        _id: "book name because it's unique", 
        author: { 
        name: "Some name", 
        bio: "Author's biography if available" 
        }, 
        contents: [ 
        { 
         text: "some long text", 
         page: 14 
        } 
        ] 
        publisher: "Some information about publisher" 
    } 
    

    И вид функции карты выглядят так:

    function (doc) { 
        if (doc._id && doc.contents) { 
        for (var i = 0; i < doc.contents.length; ++i) { 
         var page = doc.contents[i]; 
         emit([doc._id, page.page], { 
         title: doc.title, 
         content: page.text, 
         page_number: page.page, 
         author: doc.author 
         }); 
        } 
        } 
    } 
    
  2. Сплит-книга, auth или содержание в нем собственный документ:

    Книга дизайн выглядеть следующим образом:

    { 
        _id: "book:book's name", 
        type: "book", 
        publisher: "some information about publisher" 
    } 
    

    Автор дизайна:

    { 
        _id: "author:author's name", 
        type: "author", 
        name: "author name", 
        bio: "author biography", 
        book_id: "book:book's name" 
    } 
    

    Содержание дизайн:

    { 
        _id: "page: unique id", 
        type: "page", 
        page: 1231, 
        text: "the contents", 
        book_id: "book:book's name" 
    } 
    

    И посмотреть на карте функция выглядит так:

    function (doc) { 
        if (doc.type === "page") { 
        emit([doc.book_id, doc._id], { 
         book_id: doc.book_id, 
         content: doc.text, 
         page_number: doc.page 
        }); 
        } 
    } 
    

Итак, какой из них лучше? Или, может быть, вы можете предложить лучший способ сделать это? Или, может быть, база данных SQL больше подходит для базы данных книг с функциями Я упомянул выше?

ответ

0

Я думаю, что оба могут использоваться. Если вы не используете ни одного слова со страницы. Я столкнулся с проблемой, излучая огромное количество значений (100.000+) в одном документе.

Мне лично нравится возможность иметь всю информацию в пределах одного документа .. поэтому нет необходимости делать несколько запросов Fe Но имейте в виду: если вы хотите отобразить страницу в результате, клавиши (значения) становятся довольно большими. если у вас обычный прецедент показывает только отдельные страницы, то второй лучше. и используйте include_docs = true для документов страницы. (меньшее дерево поиска)

является «одним длинным текстом» текста страницы или это те ключевые слова, которые нужно задать?

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

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