【问题标题】:Is this anti-pattern way of implementing arrays fatal in Firebase Database?这种在 Firebase 数据库中实现数组的反模式方式是否致命?
【发布时间】:2021-10-07 17:15:08
【问题描述】:

首先,我阅读了Firebase Blog: Best Practices Arrays,这是有问题的反模式结构Anti-Pattern Array

这就是反模式数组的编码方式:

database.child("\(groupChatId)_I/messages").runTransactionBlock ({ (currentData: MutableData) -> TransactionResult in

        guard var currentMessages = currentData.value as? [[String: Any]] else {
            completion(false)
            return TransactionResult.success(withValue: currentData)
        }
       
        ...


        // Define the message dimensions
        let messageIndex: [String: Any] = [
            "message_id": newMessageData.messageId,
            "message_type": newMessageData.kind.messageKindString,
            "message_content": message,
            "sender_name": myName,
            "message_date": dateString,
            "sender_email": mySafeEmail,
        ]
        currentMessages.append(messageIndex)
        
        currentData.value = currentMessages
        return TransactionResult.success(withValue: currentData)
    
    })

我知道数组被描述为“邪恶的”,尤其是当多个用户尝试同时编辑同一个数组时。但是,调用 runTransactionBlock 不会阻止混乱的发生吗?如果我理解正确,它会在数组修改完成之前“锁定”该数据库目录。

我是否需要担心使用这种存储数组的反模式方式?请在提供答案时简要包含以下概念:潜在的可扩展性问题、数据库成本帐单以及存储有序数组(文本消息)的更好方法。

如果我滥用了任何术语,我提前道歉。

【问题讨论】:

    标签: arrays swift firebase firebase-realtime-database


    【解决方案1】:

    使用事务确实可以防止多个用户的冲突发生。但是,当使用事务来更新屏幕截图中的消息时,会有两个负面后果:

    1. 要添加消息,您需要在整个 messages 节点上运行事务。这意味着您需要运行 al messages 以在最后添加一条消息,这会按每个呼叫的消息数量顺序增加开销(有时也会增加您的账单)。

    2. 如果用户(暂时或半永久)未连接到数据库后端,则事务会失败。您会惊讶于移动用户连接暂时中断的频率。

    正如博文所述:要解决所有这些问题,请在数据模型中使用 push() 键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2019-01-18
      • 2018-10-12
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多