【问题标题】:MongoDb conditional relationshipMongoDb 条件关系
【发布时间】:2017-10-03 16:47:04
【问题描述】:

假设我有以下 4 个集合: 1-帖子 2-公司 3组 4-用户 贝娄是我目前的帖子结构:

它们的关系是:

  • 公司有一个所有者和许多其他成员(用户集合)。
  • 一个组有很多成员(用户)。
  • 一个用户有很多帖子。
  • 一个小组有许多帖子由其成员之一发布。
  • 一家公司有许多由其所有者或成员发布的帖子。

现在我在存储用户、公司和组与帖子集合的关系时遇到了问题。

下面是我目前的结构:

我决定在我的帖子文档中添加一个字段postable,并有一个type 字段将是“用户”、“组”或“公司”,以及另外两个字段name,和id 将是公司/组id 和公司/组name,如果帖子属于公司或组但不属于用户,则表示type="group" || type="company"

现在我该如何处理将id 映射为groupcompany 集合的FK(两个集合的一个字段FK)? 它是正确的结构吗?

【问题讨论】:

  • 我不确定我能在这里看到什么问题/问题。
  • @SergioTulentsev 我只有两个问题。 1-我的结构是否良好。 2-是否有可能有一个条件FK字段,基于另一个字段值它将是不同集合的FK?

标签: mongodb nosql


【解决方案1】:

这里有一个多态关联。在关系型数据库中,一般用postable_idpostable_type这两个字段来实现。 type 列定义要查询的表,id 列确定记录。

你可以在 mongodb 中做同样的事情(事实上,这就是你想出的,减去命名约定)。但是 mongodb 有一个专门针对这种情况的特殊字段类型:DBRef。基本上,它是一个升级的 id 字段。它不仅携带 id,还携带集合名称(和数据库名称)。

我如何处理这个以将 id 映射为组和公司集合的 FK(两个集合的一个字段 FK)?

考虑到 mongodb 没有连接并且您必须手动加载所有引用,我看不出这与常规 FK 字段有何不同。现在只是集合名称存储在类型字段中,而不是硬编码。

【讨论】:

  • 好答案!另一个问题我可以在DBRef 中添加额外的字段吗?假设我想要一些公司/集团的非规范化数据,比如公司/集团名称。
  • @jones "我可以在 DBRef 中有额外的字段吗" - 从理论上讲它看起来是可行的,但肯定是个坏主意。自己没试过。
  • 您对我的非规范化数据有何建议?
  • @jones:您可以将非规范化数据存储在 ref 字段旁边
猜你喜欢
  • 2012-05-24
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2019-07-08
相关资源
最近更新 更多