-
-
Save bitdewy/9511929 to your computer and use it in GitHub Desktop.
// !!! sketch, no constraint | |
var mongoose = require('mongoose'), | |
Schema = mongoose.Schema; | |
var WorkItemSchema = new Schema({ | |
description: String, | |
createdAt: Date, | |
lastModified: Date, | |
status: Number | |
}); | |
// no comment on comment so far | |
var CommentSchema = new Schema({ | |
username: String, | |
content: String | |
}); | |
var TagSchema = new Schema({ | |
name: String, | |
description: String | |
}) | |
var ArticleSchema = new Schema({ | |
title: String, | |
body: String, | |
createdAt: Date, | |
lastModified: Date, | |
comments: [CommentSchema], | |
tags: [TagSchema], | |
status: Number | |
}); | |
var UserSchema = new Schema({ | |
name: String, | |
email: String, | |
role: { | |
type: String, | |
default: 'user' | |
}, | |
hashedPassword: String, | |
provider: String, | |
salt: String, | |
facebook: {}, | |
twitter: {}, | |
github: {}, | |
google: {}, | |
group: Number, | |
employeeID: String, | |
works: [WorkItemSchema], | |
articles: [ArticleSchema] | |
}); |
https://gist.github.com/bitdewy/9511929#file-xocean-db-js-L29
comment 同意 nested. (原本考虑为 comment on comment 做准备的)
https://gist.github.com/bitdewy/9511929#file-xocean-db-js-L30
tag 与 article 不是 one-to-many 的关系,是 many-to-many,通过 tag 应该可以查找 article,建议保留,改成 many-to-many 的~
UserSchema,是从现在的代码里面搬运过来的,= =~
其他的想不起来了~
建议TagSchema 增加出现次数,以后可以做个热词统计。
comment on comment 用nested也同样可以的,只要我们不需要单独处理comment
MongoDB是文档型数据库,与其它关系型数据库在设计时是有些不同的,按关系型数据库思想去设计,你会很痛苦的。
tag用 String
或者 [String]
比较合适,不仅可以减少一次查询请求,而且读写也更方便。
写方便就不说了,查询可以像下面这样:
articleCollection.find({ tag: new RegExp('\bsearch_tag\b', 'i') });
或者,对于[String]
类型的:
articleCollection.find({ tag: { $elemMatch: 'search_tag' } });
同样对于查询所有tag也是可以只用一次查询就做到的。
mongoose虽然是orm框架,但对于两个Collection的关联并不会自动给你处理,MongoDB的DBRef
基本约等于手动。
var WorkItemSSchema = new Schema({
createdAt: Date,
lastModified: Date,
summaryItems:[WorkItemSchema],
planItems:[WorkItemSchema]
});
var WorkItemSchema = new Schema({
description: String,
status: Number
})
工作项那块可能得复杂一点
@ijse 懂了~ 原则就是能在一个 collection 里就尽量在一个 collection 里, 文档型想怎么嵌套怎么嵌套, 随意度有点高啊~
gist 是没有 notification ??!!! (╯‵□′)╯︵┻━┻
@bitdewy
那还是单独的吧,不过还是得加个字段区分下上周还是下周吧
不是那么简单的原则。。 其实我觉得设计的时候需要各种权衡,最重要的是要跟业务结合,有过一些经验,设计的时候就可以避免走一些弯路。
可以去参考下其它开源项目的源码,很多的。
那个数据库设计的三泛式其实在这里不是特别适合。
https://gist.github.com/bitdewy/9511929#file-xocean-db-js-L29-L30
这两个字段,根据业务需求,简单存成nested的就可以了
https://gist.github.com/bitdewy/9511929#file-xocean-db-js-L43
是不是可以不存salt? 用户密码加密可以采用password + userSalt + globalSalt 形式
另外,还缺不少字段 。。