相关疑难解决方法(0)

在firebase上构建数据的最佳方法是什么?

我是firebase的新手,我想知道在其上构建数据的最佳方法是什么.

我有一个简单的例子:

我的项目有申请人和申请.1申请人可以有几个申请.如何在firebase上关联这两个对象?它是否像关系数据库一样工作?或者在数据设计方面需要完全不同的方法?

nosql data-structures firebase firebase-realtime-database

107
推荐指数
2
解决办法
5万
查看次数

Firebase:在单个事务中更新多个对象

我在下面找到了一些讨论这个场景的线程.

但是仍然很难找到,如果有任何推荐的数据结构设计.我看到一个多写库firebase-multi-write,它说你在大多数情况下可能不需要这个.

但我认为我确实需要这个,我的情况是:3个用户

/users/A : {credit:20}

/users/B : {credit:3}

/users/C :  {credit:10}
Run Code Online (Sandbox Code Playgroud)

每个用户可以窃取相互学分都在同一时间,

  • B点数的抢断看起来像{21,2}
  • 来自C点数的B抢断看起来像{3,9}
  • 来自A学分的C抢断看起来像{11,20}

现在我需要为每个用户更新信用以保持这种一致性,这样每个窃取操作本质上都是原子的.

在保持Java数据完整性的同时,处理此类场景的最佳方法是什么?

java firebase

6
推荐指数
1
解决办法
3102
查看次数

跨多个节点的Firebase数据一致性

根据firebase文档,数据被展平,索引用于链接树中的不同节点:

users
  $userId
    widgets
      $widgetId
widgets
  $widgetId
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果用户创建窗口小部件,widgetid则该窗口小部件也存储在用户节点下.

我的问题是,是否有办法保证操作的一致性,考虑到现在需要多次写入.

假设第一个操作是:

var newKey = fb.child('widgets').push({ name: 'widge' }).key();

然后我可以把它写到:

fb.child('users').child(auth.id).child('widgets').child(newKey).set(true);

但是,如果两次写入之间出现故障或其他问题怎么办?或者,如果我有多个位置,我需要存储该密钥,并且这些写入之间发生故障?

目前有没有办法在firebase中处理这个问题?

如果没有,是否有计划在未来支持这一点?

如果是这样,有人可以提供一个具体的例子来说明如何做到这一点?

firebase

5
推荐指数
0
解决办法
1472
查看次数

Firebase:如何以事务方式更新多个节点?迅捷3

我正在开发一个用于清洁服务的应用程序。在此应用程序中,员工(清洁工)可以读取由多个客户(用户)完成的作业(预订)列表。

所有清洁工都可以在“用户”节点中读取所有预订。最初,当用户将预订保存在数据库中时,该键claimed:的值为 “false”,这意味着清洁工尚未声明该键。

每当清洁工想要索取列表中存在的工作时,他将必须触摸按钮,该按钮将向Firebase数据库发出请求以将key的值修改claimedtrueat路径。 /Users/UID/bookings/bookingNumber

一次只能允许一名清洁工修改claimed钥匙的价值。如果允许多个清理者修改claimed密钥的值,其他清理者最终将要求相同的工作。我们不希望这种情况发生。

此外,在清理者将claimedkey 的值修改为之后true,我们将需要再次请求路径CLeaners/UID/bookings/bookingNumber以保存他刚刚在清理者节点中声明的预订。
-根据firebase的文档,每当我们希望一次仅由一个请求修改一个资源时,就会使用事务,如果有多个并发请求试图写入同一资源,则其中一个会成功。但是使用事务的问题在于,它只能写入一条路径,而不能写入多条路径

如何确保即使有多个用户可以读取此路径 /Users/UID/bookings/bookingNumber,一次也只能更新一个用户?如果写入成功,则进一步写入第二条路径 Cleaners/UID/bookings/bookingNumber

我们需要考虑到客户端的互联网连接可能断开,用户可以退出该应用程序,或者只是手机在写入上述指定路径之间的任何时间意外关闭。

数据库结构如下

Root
  Cleaners
    UID
     bookings
       bookingNumber
         amount: “10”
         claimed: “true”


   Users
     UID
      otherID
        bookingNumber
          amount: “10”
          claimed: “true”

         bookingNumber
          amount: “50”
          claimed: “false”
Run Code Online (Sandbox Code Playgroud)

为了避免任何覆盖,我决定使用Firebase事务。我可以将单个节点作为事务写入,但是在完成处理程序中写入第二个节点不是解决方案,因为在从服务器接收响应之前,清洁程序的Internet连接可能会断开,或者应用程序可能会退出,因此,完成处理程序{(error, committed,snapshot) in....将不会被评估,并且第二次写入将不会成功。

另一种情况是:执行第一次写操作,
1.在客户端应用程序中收到响应
2. 在客户端应用程序中尚未收到响应
,用户立即退出该应用程序。在这种情况下,将永远不会执行第二次写操作,因为在完成处理程序中收到(或未收到)响应后,尚未评估任何代码,因此数据库处于不一致状态。


从Firebase文档:

事务不会在应用程序重启后持续存在

即使启用了持久性,事务也不会在应用程序重启后持久化。因此,您不能依赖脱机完成的事务提交到Firebase实时数据库。

  • 是否可以使用Swift中的Firebase事务写入Firebase数据库中的多个节点?

如果是这样,我该怎么做?我在此博客中没有看到来自Google https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html的示例 。我确实知道您可以原子地写多个节点,但是我想作为事务来写。我试图在else …

firebase swift firebase-realtime-database

2
推荐指数
1
解决办法
1464
查看次数