ios - Firebase 数据库结构 - 需要建议

标签 ios swift firebase firebase-realtime-database nosql

我知道这个问题可能被视为基于意见的问题,但我认为值得讨论正确构建数据库的方法。我在 Swift 中开发 iOS 应用程序,并决定使用 firebase 作为我的后端服务

让我们从应用描述开始

The app aims to provide tracking and social features to book reading experience, as well as create books database. User adds book, fill basic info like title, author, language, number of pages etc. Next, this book is visible on the list in app, where user can easily access the book info and save the information on which page he/she recently ended reading. After a book is marked as read, user obtains experience points and badge. Ultimately, the user is going to be able browse friend's achievements, create a leaderboard etc.

这是我对数据库结构的想法:

  Users:
    user_id:121jhg12h12
      email: "john@doe.com"
      name: "John Doe"
      profile_pic_path: "https://...".
      language: "en"
      exp_points: 1284
      friends: [user_id]
      books: [[book_id, status, current_page, start_date, finish_date]]
      badges: [[badge_id, get_date]]

  Books:
    book_id: 3213jhg21
      title: "For whom the bell tolls"
      author: "Ernest Hemingway"
      language: "en"
      pages_count: 690
      ISBN: "21hjg1"
      year: 2007

  Badges:
    badge_id:213hg12
      name: "Great reader!"
      image_path: "https://...".

我使用伪代码填充了一些虚拟数据而不是 JSON 格式以使其更具可读性,如果我失败了,请告诉我。

我想通过问这个问题来获得一个明确的答案,如果我的方法是正确的,或者我应该改变数据库结构中的某些东西以磨练 future 的可扩展性和一般性能。

请注意,我知道这个问题可能被认为更适合代码审查论坛,但如您所知,很少有人在那里回答,尤其是在像 firebase 数据库结构这样的狭窄主题中。

提前致谢

最佳答案

在我看来,您的书籍和角标(Badge)数据模型看起来完全没问题。它们将对应用中的任何用户公开,并且不存储任何复杂数据。

现在获取用户对象: 1) 对于将发生用户交互的此类应用程序,您很可能希望通过不存储用户的电子邮件来保护用户的隐私(因为用户对象必须可供其他人读取)。电子邮件已经嵌入到用户的身份验证 token 中,因此将其也保存到数据库中是多余的并且会降低隐私。如果你真的想保存它,你可以创建一个名为“user_private”的新对象,并让它只能由用户自己读取。

2) 对于存在好友列表的应用程序,您还需要一个好友请求系统。为此,我建议创建一个名为“outgoing_requests”的键,这是您发送给其他用户(w/userID)但仍不完整的所有好友请求。此外,创建一个名为“incoming_requests”的键,其中包含其他用户发送给您的请求。这就是您用来创建好友请求页面并允许用户接受或拒绝的内容。这给 JSON 规则带来了一些复杂性。我会这样布局:

  • outgoing_requests:用户自己可写(取消请求)或拥有请求id的用户(接受或拒绝请求)
  • incoming_requests:可由用户自己写入(接受或拒绝)或由具有请求 ID 的用户写入(取消)
  • friends_list:如果新条目和 id 是传入请求的一部分,则可写,或者删除,这是我的用户

3) 您还可能会根据时间戳查询用户的图书。因此,我会对其进行布局以便于实现(数组将不起作用,因为用户可能会开始阅读他们有一段时间未打开的书,并且顺序会混淆)。您可以像这样存储用户的书籍:

books:
  book_id:
    lastopened_date:
    status:
    current_page:
    start_date:
    finish_date:

然后,在状态中,存储“完整”或“不完整”。如果不完整,将使用“lastopened_date”和“current_page”。如果完成,将使用“start_date”和“finish_date”。那么很容易查询完成的书籍是什么时候完成的,以及查询未完成的书籍是最后一次打开的日期。 角标(Badge)可以这样存储:

badges:
  badge_id:
    get_date:

像这样存储书籍和角标(Badge)可以更容易地根据时间戳进行查询。这就是我现在能想到的一切。如果您有任何问题,请告诉我。

关于ios - Firebase 数据库结构 - 需要建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38868947/

相关文章:

ios - Xcode 不按照目标依赖项中指定的顺序运行测试目标

ios - 如何将标签设置为UICollectionView-SWIFT-同一屏幕上的多个CollectionView

ios - 创建 iOS 应用程序的工作流程是什么

ios - 将 if 语句更改为 guard 会引发此错误。条件绑定(bind)的初始化程序必须具有 Optional 类型,而不是 '(Bool, String)'

android - 如何在库模块中使用不同的包名称进行调试和发布?

flutter - 在 flutter firebase 中,我收到错误 : [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation

ios - Rails Devise Api + Facebook iOS SDK,安全问题

swift - 如何快速获取结构中的变量名?

javascript - 在 angularjs 中观看 Firebase 查询

swift - (Swift) 将图片添加到我的注释标注中