MongoDB:用户和活动的嵌入式或规范化数据模型

时间:2014-10-16 22:18:37

标签: mongodb database-design model database

我正在为一个新项目设计我的数据库模型,因为我来自SQL世界,我不确定哪种方法更好。

这是我的主要关系:

  • 用户组织的活动。 (例如:约翰正在组织足球比赛 游戏)
  • 加入活动的用户。 (例如:安娜和罗布参加了约翰组织的足球比赛)
  • 活动属于类别/活动类型(约翰的游戏属于足球类别)
  • 用户在完成活动后对其他用户进行评分(例如:约翰评价Anna为5星,Rob为5星级表现 在足球比赛期间)。

伪代码将是这样的:

  1. 用户

    • _id
    • 全名
    • 电子邮件
    • 密码
    • loc({lon:X,lat:Y})
    • 活动(活动数组)
    • average_rate
    • created_at
    • 的updated_at
    • _id
    • 时间戳
    • 活动(活动)
    • rater_user(用户)
    • rated_user(用户)
    • created_at
    • 的updated_at
  2. ActivityType

    • _id
    • 名称
    • 半径
  3. 活动

    • _id
    • type(ActivityType)
    • 组织者(用户)
    • loc({lon:X,lat:Y})
    • 地址
    • 时间
    • max_participants
    • 描述
    • 参与者(用户数组)
    • requests(用户数组)
    • created_at
    • 的updated_at
  4. 我应该从这种规范化方法转向嵌入式数据模型吗?

2 个答案:

答案 0 :(得分:3)

以下是我写的mongodb中嵌入或引用的答案。强烈推荐。

MongoDB for BI use

嵌入更适合:

  
      
  • 小子文档
  •   
  • 不经常更改的数据
  •   
  • 当最终的一致性可以接受时
  •   
  • 少量增长的文件
  •   
  • 您经常需要执行第二次查询才能获取的数据
  •   
  • 快速阅读速度
  •   

更适合参考
  
      
  • 大型子文档
  •   
  • 易变数据
  •   
  • 当需要立即一致时
  •   
  • 文档大量增长
  •   
  • 您经常从文档中排除的数据
  •   
  • 快速写入速度
  •   

- 来自“Mongodb权威指南”

答案 1 :(得分:0)

这取决于您需要删除,更新和查询类型。

  • 如果没有嵌入设计,您应该运行一些 Join Like 查询 检索数据,它需要随机的硬盘驱动器,它需要一些 额外的时间
  • MongoDb只增长数据库(大小)意味着删除文档不会 减少数据库(和文件系统)的大小,这将导致许多删除操作 数据碎片。如果您使用更大的文档更新文档 mongo将删除文档并将其插入其他地方 您在删除文档时遇到相同的碎片问题,在嵌入系统中您必须处理 更多碎片问题
  • ...

我建议您阅读本书Mongodb Applied Design Patterns