Firebase数据库中的多对多关系 - 对我的数据模型的建议

时间:2018-04-17 09:48:23

标签: firebase firebase-realtime-database

我正在尝试为我的第一个Firebase项目制定数据模型。和其他许多人一样,我正在努力找出建模数据的最佳方法。

我有一个包含声音的词组的列表。每个短语可以有许多声音,但声音可以是许多短语的一部分。

用户将查看短语数据,然后“更深入”并查看与当前短语相关联的每个声音。每页一个声音。

到目前为止,我有一个4节点解决方案:

phrases: {
  phraseKey1: {
    //  ... phrase data
  },
  phraseKey2: {
    // ... phrase data
  }
}

sounds: {
  soundKey1: {
    // ... sound data
  },
  soundKey2: {
    // ... sound data
  },
  soundKey3: {
    // ... sound data
  }
}

soundsPerPhrase: {
  phraseKey1: {
    soundKey1: true,
    soundKey2: true
  },
  phraseKey2: {
    soundKey3: true,
    soundKey2: true
  }
}

phrasesPerSound: {
  soundKey1: {
    phraseKey1: true
  },
  soundKey2: {
    phraseKey1: true,
    phraseKey2: true
  },
  soundKey3: {
    phraseKey2: true
  }
}

通过阅读this one等其他帖子和一个udemy课程,我发现这可以很好地运作。 但是,我的具体需求是每个短语中的声音按特定顺序排列。

为每个词组复制声音条目会更好吗?因为在每个短语中它可能处于不同的位置?我知道我可以运行查询并按某个属性对结果进行排序,但这只是一个只知道作者的自定义顺序。

或者是否有另一种更好的方法来根据我的需求对数据进行建模?

我需要能够查找当前短语的声音。然后在应用程序的另一个区域中,查找声音存在的短语。

我有点像砖墙。

提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

  

我的具体需求是每个短语中的声音按特定顺序

在这种情况下,您可以为短语中的每个声音保留一个值:

soundsPerPhrase: {
  phraseKey1: {
    soundKey1: 1,
    soundKey2: 2
  },
  phraseKey2: {
    soundKey3: 1,
    soundKey2: 2
  }
}
  

复制每个短语的声音条目会更好吗?

这始终是一个考虑因素。我经常看到开发人员在读取很多而不是编写/修改数据时复制数据。

这里的权衡是读取性能与写入性能。如果您复制数据读取它将更快(更简单),因为您需要从较少的位置读取。另一方面,写入数据会更慢(也更复杂),因为您要写入多个位置。

请注意,这些只是需要考虑的事项。没有单一的最佳数据模型。在NoSQL数据库中,数据模型通常随着您的用例集和您对NoSQL模型的体验/舒适程度而发展。