- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在调查 Firebase 数据库 sample对于安卓并意识到它以下列方式存储其数据:
我不太熟悉 NoSQL 技术并试图理解为什么我们必须坚持每个 post
实体两次 - 在 posts
和 user_posts
相应地。文档说这种方法称为“扇出”,我完全同意通过像 databaseReference.child("user-posts").child("<user_uid>")
这样的简单构造来访问用户的帖子可能很有用。 .但是为什么我们需要 posts
节点呢?如果我们需要更新一些帖子怎么办 - 我们必须更新两次吗?
// [START write_fan_out]
private void writeNewPost(String userId, String username, String title, String body) {
// Create new post at /user-posts/$userid/$postid and at
// /posts/$postid simultaneously
String key = mDatabase.child("posts").push().getKey();
Post post = new Post(userId, username, title, body);
Map<String, Object> postValues = post.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, postValues);
childUpdates.put("/user-posts/" + userId + "/" + key, postValues);
mDatabase.updateChildren(childUpdates);
}
// [END write_fan_out]
所以我想知道...这种方法何时有用,何时无用? Firebase SDK 是否提供任何工具来在更新或删除数据时使所有重复项保持同步?
更新:这是解释 received来自 Firebase 团队:
the reason the posts are duplicated is because we want to be able to quickly get all the posts belonging to a user (as you suggested) and filtering from the list of all posts ever to get the posts by one user can get pretty expensive as the number of posts expands.
This does mean that we have to update the post in two locations whenever we update it. It makes the code a little uglier but since queries are more common than writes it's better to optimize for reading the data.
我怀疑这种方法可能看起来不太优雅,但它可能是大型数据集的最快选择,只要您执行 SELECT 的频率高于 UPDATE。但是,在某些情况下,我宁愿坚持使用此处推荐的其他解决方案。
最佳答案
数据扇出是一种管理大量数据的好方法。如果不使用此模式,将来可能会遇到严重的缩放问题。
我从您的数据库结构中看到,您将整个帖子信息存储两次,这不是一个好的做法。您希望在另一个节点下存储只是对帖子的引用。因此,您将有一个名为 users-posts
的节点,它将包含用户键,并且每个键都有一组值为 true
的帖子键。为了更清楚:
这样,您就可以跟踪用户在 users-posts
节点下写了哪些帖子;以及在 posts
节点下撰写每篇文章的用户。现在,您可能需要获取所有用户帖子的列表。您需要做的是在 users-posts/USER_KEY/
节点上同步以获取用户已写的所有帖子的 key ,然后获取更多发布信息使用您刚刚获得的发布 key 。
为什么推荐这种数据库设计?因为您每次同步获得的信息少得多(对于 Firebase,我们本身不发出请求,因此我将读取称为同步)。在您的示例中,如果您将监听器附加到 user-posts/USER_KEY/
以获取所有帖子的列表,您还将要求ALL 的信息>每一个他们写的帖子。使用数据扇出方法,您可以只询问您需要的帖子信息,因为您已经拥有帖子的 key 。
关于java - Firebase 数据库 - "Fan Out"技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181973/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!