Node.js - Mongoose / MongoDB - Схема модели - PullRequest
1 голос
/ 09 декабря 2011

Я создаю систему блогов в Node.js с mongodb в качестве базы данных.

У меня есть такое содержимое: (статьи блога):

// COMMENTS SCHEMA:
// ---------------------------------------
var Comments = new Schema({

    author: {
        type: String
    },
    content: {
        type: String
    },
    date_entered: {
        type: Date,
        default: Date.now
    }

});
exports.Comments = mongoose.model('Comments',Comments);
var Tags = new Schema({ 
    name: {
        type: String
    } 
});
exports.Tags = mongoose.model('Tags',Tags);


// CONTENT SCHEMA:
// ---------------------------------------
exports.Contents = mongoose.model('Contents', new Schema({

    title: {
        type: String
    },
    author: {
        type: String
    },
    permalink: {
        type: String, 
        unique: true,
        sparse: true
    },
    catagory: {
        type: String,
        default: ''
    },
    content: {
        type: String
    }, 
    date_entered: {
        type: Date,
        default: Date.now
    }, 
    status: {
        type: Number
    },
    comments: [Comments],
    tags: [Tags]

}));

Я немного новичок в этом типе базы данных, я привык к MySQL в стеке LAMP.

По сути, мой вопрос таков:

  • Как лучше всего связать автора контента с пользователем в БД?
  • Кроме того, как лучшеделать теги и категории?

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

СПАСИБО ЗА ВАШЕ ВРЕМЯ !!

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Пара идей для Mongo:

  • Лучший способ связать пользователя - это адрес электронной почты - в качестве атрибута документа содержимого / комментария - электронная почта обычно является надежным уникальным ключом,MongoDB не имеет внешних ключей или связанных ограничений.Но это нормально.
  • Если у вас есть политика регистрации, добавьте имя пользователя, адрес электронной почты и другие данные в коллекцию пользователей.Затем отмените нормализацию содержимого документа, указав имя пользователя и адрес электронной почты.Если по какой-либо причине пользователь меняет имя, вам придется обновить все связанное содержимое / комментарии.Но если в документах указан адрес электронной почты, это должно быть просто.
  • Теги и категории лучше всего моделировать как два списка в документе с содержимым, ИМХО.
  • Вы также можете создать два индекса для этих атрибутов, если это необходимо.Зависит от шаблонов доступа и функций пользовательского интерфейса, которые вы хотите предоставить
  • Вы также можете добавить документ, который хранит список тегов и список категорий в коллекции содержимого, и использовать $ addToSet для добавления новых тегов и категорий к этому.документ.Затем можно отобразить поле со списком с текущими тегами в качестве отправной точки.
  • В качестве конечной точки продумайте, как вы планируете получить доступ к данным, а затем соответствующим образом спроектируйте документы, коллекции и индексы
  • [Обновление 12/9/11] Был в MongoSv, и Eliot (CTO 10gen) представил образец, относящийся к этому вопросу: вместо одного документа с комментариями на пользователя (который может стать большим) нужно иметь документ с комментариями в день для использованияс _id = -YYYYMMDD или даже один раз в месяц в зависимости от частоты комментариев.Это оптимизирует создание индекса / рост документа по сравнению с распространением документа (в случае дизайна, когда на пользователя приходится один комментарий).
0 голосов
/ 08 января 2013
  1. Лучший способ связать авторов контента с пользователем в MongoDB - это взять массив в коллекции авторов, содержащий ссылку на пользователя.В основном это массив, потому что у одного контента / книги может быть несколько авторов, т. Е. Вам нужно связать один контент со многими пользователями.

  2. Лучший способ для категории - создать другую коллекцию в вашей БД и аналогичным образом.как указано выше, сохраняйте массив в Contents.

Надеюсь, это поможет хотя бы немного.

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