我正在尝试为我的第一个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课程,我发现这可以很好地运作。 但是,我的具体需求是每个短语中的声音按特定顺序排列。
为每个词组复制声音条目会更好吗?因为在每个短语中它可能处于不同的位置?我知道我可以运行查询并按某个属性对结果进行排序,但这只是一个只知道作者的自定义顺序。
或者是否有另一种更好的方法来根据我的需求对数据进行建模?
我需要能够查找当前短语的声音。然后在应用程序的另一个区域中,查找声音存在的短语。
我有点像砖墙。
提前感谢您的时间。
答案 0 :(得分:1)
我的具体需求是每个短语中的声音按特定顺序
在这种情况下,您可以为短语中的每个声音保留一个值:
soundsPerPhrase: {
phraseKey1: {
soundKey1: 1,
soundKey2: 2
},
phraseKey2: {
soundKey3: 1,
soundKey2: 2
}
}
复制每个短语的声音条目会更好吗?
这始终是一个考虑因素。我经常看到开发人员在读取很多而不是编写/修改数据时复制数据。
这里的权衡是读取性能与写入性能。如果您复制数据读取它将更快(更简单),因为您需要从较少的位置读取。另一方面,写入数据会更慢(也更复杂),因为您要写入多个位置。
请注意,这些只是需要考虑的事项。没有单一的最佳数据模型。在NoSQL数据库中,数据模型通常随着您的用例集和您对NoSQL模型的体验/舒适程度而发展。