假设我们要从questions
节点中检索15个随机子节点,这个节点的数据库结构如下:
1。从Firebase检索随机子节点的第一种(直观和讨论)方法是检索整个所需的父节点(questions
作为dataSnapshot),然后选择一些随机子节点客户端。许多帖子都指出了这种方法,例如this one here 。
显然,这种方法有其缺点;例如,当查询大型父节点(例如超过10,000个孩子)时,每次检索这样的数量会导致巨大的带宽使用以及客户端负担。(当我们实际上只需要少量的孩子时)
2。继续:另一种方法,如here所述,它使用迭代器以某种方式绕过整个客户端负担,但巨大的带宽使用可以我们每次都下载整个父节点时仍会出现。
3。汤姆在this firebase discussion中的答案中描述了一种有趣的方法:
执行此操作的一种hacky方法是生成随机密钥并使用startAt()。limit(1)执行查询。我觉得这可能会损害你的firebase的性能,所以这不应该是你经常执行的操作。我们没有真正的随机样本函数。
这个解决方案实际上听起来不错,但我不确定它会如何影响我的Firebase。
4. 另一个愚蠢的解决方案实际上可以手动命名问题ID,可以说从0到N,因此在客户端处理随机的id组并检索问题点 - 知道节点的实际名称。
5。最后,我提出了以下解决方案,我问它是否比上面提到的更可行或更不可行:只创建包含问题ID的另一个父级,并且在需要时,应该检索此父级,即比questions
父母“更轻”。从那里,我会有特定的随机ID,我只需要狙击那些孩子。为了更好地理解我的意思,请查看下面的图片:
现在,从这种方法出现以下问题:分配(比方说)15 eventListeners
良好做法?这真的会让事情变慢吗? (注意:这也适用于方法3和4)
最终,从大型数据库查询某些随机孩子时,哪种方法实际上是最佳方法?
答案 0 :(得分:1)
您可以使用我在answer中解释的经典解决方案,但如果您害怕获取大量数据,请使用15个侦听器。使用侦听器没有任何问题,只要您根据活动的生命周期将其删除即可。所以,恕我直言有15名听众。
答案 1 :(得分:0)
我们这里有2个案例
案例1
如果你想一次获取随机id的所有细节,那么我建议1个父节点的监听器(使用pojo类获取datasnapshot的值)。
案例2
如果您想根据要求独立获取详细信息,那么您必须为每个(随机ID)附加一个监听器。
关于效果
尝试仅使用Listener For Single Value Events,因为他们一次听,然后停止(更好的表现)。
不要使用Value Event Listener(因为这些侦听器会继续检查更改,因此随着侦听器的增加而导致性能下降)。
修改强>
让我们说你听了(questions_ids)节点,现在你可以访问随机id键,将它们存储在String变量中,然后在同一个监听器内添加另一个监听器(问题)指向你想要的id抓住细节
import re
s= 'Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm'
pattern = r'\d{2}:\d{2}[AaPp][Mm]'
timestamps = re.findall(pattern, s)[:2]
print(timestamps)