Swift: действительно ли транзакции - самый эффективный способ хранить лайки в Firebase? - PullRequest
0 голосов
/ 09 марта 2020

В официальном руководстве Firebase блок транзакций используется для установки лайков для поста в базе данных.

В этом примере количество сообщений в сообщении (также называемое starCount) сохраняется как Int. Идентификатор пользователя каждого, кому понравилась запись, сохраняется как дочерний элемент под идентификатором записи (под "звездами").

-postID
  -starCount: 5281  // number of likes
  -stars            // list of everyone that liked the post
    -userID
    -userID
    -userID
    -userID
    ...

Когда пользователю нравится публикация, для ссылки на эту запись выполняется следующая транзакция в база данных:

ref.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in

  // Store the post and current user
  if var post = currentData.value as? [String : AnyObject], let uid = Auth.auth().currentUser?.uid {

    // Store the user ID of everyone that liked the post in a Dictionary
    var stars: Dictionary<String, Bool>
    stars = post["stars"] as? [String : Bool] ?? [:]

    // Store the number of likes 
    var starCount = post["starCount"] as? Int ?? 0

    // Unlike: If the user appears in the dictionary and has already liked the post,
    if let _ = stars[uid] 
    {
      // Unstar the post and remove self from stars
      starCount -= 1
      stars.removeValue(forKey: uid)
    } 
    // Like:
    else 
    {
      // Star the post and add self to stars
      starCount += 1
      stars[uid] = true
    }

    // Store the new like values for the post
    post["starCount"] = starCount as AnyObject?
    post["stars"] = stars as AnyObject?

    // Set value and report transaction success
    currentData.value = post

    return TransactionResult.success(withValue: currentData)
  }
  return TransactionResult.success(withValue: currentData)
})

Мой вопрос: не является ли это неэффективным способом отслеживания лайков в посте?

Предположим, пост имеет более 100 000 лайков , Каждый раз, когда нажимается кнопка «Мне нравится», программа должна запросить все 100 000 идентификаторов пользователей в словаре, проверить, существует ли текущий идентификатор пользователя в этом словаре, и обновить базу данных новым словарем лайков.

Не может быть так плохо, если он указан в руководстве по Firebase. Но мне кажется, что получать и устанавливать такой большой словарь каждый раз, когда публикация нравится, не очень хорошая идея. Должен быть лучший способ проверить, понравился ли текущий пользователь сообщение, не запрашивая каждый идентификатор пользователя каждый раз. Это звучит так же дорого, как вызов childrenCount для моментального снимка и получение количества лайков путем подсчета.

В приложении с миллионами пользователей и тысячами лайков каждую секунду объем данных, хранящихся на стороне пользователя и отправлено обратно в базу данных кажется подавляющим. Возможно, я не до конца понимаю нюансы функции транзакции, но это кажется опасной вещью, поскольку приложение получает больше пользователей.

Спасибо за чтение, мне любопытно узнать, что вы думаете.

...