yorkie/me

2015-12-07

yorkie opened this issue · 0 comments

今日GET

  • loopback中,可以使用{"root": true}来设置返回传入的对象本身(来自于团队小伙伴)
  • loopback中,关系belongsTo中的foreignKey是当前模型的字段名,如:userId, commentId
  • 星巴克的瓶装饮料很解困
  • 原来_京东_送货也有不能当日抵达的

如何使用 MongoDB 构建一个关系图谱?

由于这两天在给某个项目中加入社交相关联的东西,于是记录一下学习的成果

原来其实对文档数据库与关系数据库一直含含糊糊地,弄不清楚。知道昨天看了一篇文章:

neo4j-vs-mysql-vs-mongodb: http://addisonlee.azurewebsites.net/neo4j-vs-mysql-vs-mongodb/

分别对比了文档数据库、关系数据库以及图谱数据库,也直接引出了我今天的思考。每一类型的数据库跟它的数据结构有直接关系,由于数据结构的不同,会出现不同的用法。简单地说:

  • 关系数据库 就是一个带范型的集合,比如:List, List等等
  • 文档数据库 可以看成是一个个的对象组成,比如:new User(), new Order()
  • 图谱数据库 我觉得只是在文档数据库的基础上,存储了从对象A到对象比的一个动作

中途我参考了一个叫 Wordnik 的例子,从这个团队的名字就能看出,他们是做字典应用的,从他们的 Keynote 中,我大概了解到图谱(graph)作为一种通用的数据结构,一般有以下的用途:

  1. 地图应用,主要是查看从地点1到地点2中间的路径,属于路径问题
  2. 字典应用,主要是查看可以从单词a拓展到哪些其他相关的单词,属于关联性问题

他们在视频里讲了很多废话,我就直接上他们的数据结构:

{
  "id": "cat+context",
  "tn": [
    { "weight": 1, "id": "dog+context" },
    { "weight": 2, "id": "yorkie+context" }
  ]
}

当然具体的数据是我瞎编的,其实他们的实现跟我之前的想法大致一样,不过还是有些出入,我的思维可能会更偏关系型数据库一些:

[{ "source": "cat+context"
,  "linkTo": "dog+context" },
{  "source": "cat+context"
,  "linkTo": "yorkie+context" }]

所以,前者才是文档数据库正确的打开方式

于是我参考了 Wordnik 的方案,把id从指向的是一个单词,换为指向人名(username):

{
  "id": "jobs",
  "tn": [
    { "type": "like", "id": "yorkie" },
    { "type": "hate", "id": "bill" }
  ]
}

这样一个简单的图谱数据结构就在 MongoDB 中定义完成了。