在 NoSQL (Firestore) 中组合两个数据集,其中一个是日期范围,一个是日期 - 没有 N+1 查找?
Combine two datasets in NoSQL (Firestore) where one is date-range and one is date - without N+1 lookups?
我在使用 GCP Firestore (Nosql) 的 Node.js 应用程序中遇到 programming/logic 问题。该应用程序是 JS/Node.js 的事实与这个问题无关(我相信),因为这个问题更像是一个 pseudocode/logic 问题。
我在 Firestore 中有两个数据集。一种叫做Days
,一种叫做Events
。我使用 Days 数据集在应用程序上显示这些天发生的有趣事情。事件是可以持续 1 到最多 7 天的事件,有开始日期和结束日期。事件(尽管名称)很少更新(每月一次)。示例:
天数据集(约 7000 项):
'2017-04-02': {
'description': 'A fun day'
},
'2017-04-01': {
'description': 'A boring day'
},
'2017-03-30': {
'description': 'A random day'
}
事件数据集(约 70 项):
'one-day-event': {
'startDate': '2017-04-01',
'endDate': '2017-04-01'
},
'multiple-day-event': {
'startDate': '2017-03-28',
'endDate': '2017-04-03'
},
'multiple-day-short-event': {
'startDate': '2017-04-01',
'endDate': '2017-04-02'
}
我想要的:我想遍历 Days 并找到这一天发生的所有事件。这可以简单地通过查找来完成,每天查找事件日期范围内存在的日期,但这是非常无效的 (N+1)。
我还可以使用事件中的数据预先填充所有日期,以便“2017-04-01”这一天包含这三个事件。但是那样的话,数据在不同的地方将是相同的,这只是糟糕的编码。
因此,最好的结果是让 Day 与 Events“预先关联”。我最好的选择是每月安排 运行 并相应地填写天数吗?
'2017-04-01': {
'description': 'A boring day',
'eventIds': ['one-day-event', 'multiple-day-event', 'multiple-day-short-event']
},
然后做一个N+1单.doc()
-lookup,这样至少会好一些。
我有哪些选择?
在关系数据库上,您将执行 server-side 连接以在单个查询中从两个(或更多)表中获取数据。但是在 Firestore 上不可能有这样的 server-side 连接。
But then that data will be identical in different places, which would just be bad coding.
这就是你错的地方。虽然关系数据库对于不重复数据通常非常教条,但 NoSQL 数据库采取不同的立场并专注于几乎任何事情的可扩展性能。因此,在您的场景中,将一天的数据复制到每个事件中,或者将每个事件的一些数据复制到一天中,实际上是很常见的。
我建议查看这些以了解更多信息:
- 这篇文章 NoSQL data modeling。
- 视频系列Getting to know Cloud Firestore
- 我在
上的回答
我在使用 GCP Firestore (Nosql) 的 Node.js 应用程序中遇到 programming/logic 问题。该应用程序是 JS/Node.js 的事实与这个问题无关(我相信),因为这个问题更像是一个 pseudocode/logic 问题。
我在 Firestore 中有两个数据集。一种叫做Days
,一种叫做Events
。我使用 Days 数据集在应用程序上显示这些天发生的有趣事情。事件是可以持续 1 到最多 7 天的事件,有开始日期和结束日期。事件(尽管名称)很少更新(每月一次)。示例:
天数据集(约 7000 项):
'2017-04-02': {
'description': 'A fun day'
},
'2017-04-01': {
'description': 'A boring day'
},
'2017-03-30': {
'description': 'A random day'
}
事件数据集(约 70 项):
'one-day-event': {
'startDate': '2017-04-01',
'endDate': '2017-04-01'
},
'multiple-day-event': {
'startDate': '2017-03-28',
'endDate': '2017-04-03'
},
'multiple-day-short-event': {
'startDate': '2017-04-01',
'endDate': '2017-04-02'
}
我想要的:我想遍历 Days 并找到这一天发生的所有事件。这可以简单地通过查找来完成,每天查找事件日期范围内存在的日期,但这是非常无效的 (N+1)。
我还可以使用事件中的数据预先填充所有日期,以便“2017-04-01”这一天包含这三个事件。但是那样的话,数据在不同的地方将是相同的,这只是糟糕的编码。
因此,最好的结果是让 Day 与 Events“预先关联”。我最好的选择是每月安排 运行 并相应地填写天数吗?
'2017-04-01': {
'description': 'A boring day',
'eventIds': ['one-day-event', 'multiple-day-event', 'multiple-day-short-event']
},
然后做一个N+1单.doc()
-lookup,这样至少会好一些。
我有哪些选择?
在关系数据库上,您将执行 server-side 连接以在单个查询中从两个(或更多)表中获取数据。但是在 Firestore 上不可能有这样的 server-side 连接。
But then that data will be identical in different places, which would just be bad coding.
这就是你错的地方。虽然关系数据库对于不重复数据通常非常教条,但 NoSQL 数据库采取不同的立场并专注于几乎任何事情的可扩展性能。因此,在您的场景中,将一天的数据复制到每个事件中,或者将每个事件的一些数据复制到一天中,实际上是很常见的。
我建议查看这些以了解更多信息:
- 这篇文章 NoSQL data modeling。
- 视频系列Getting to know Cloud Firestore
- 我在