【问题标题】:Firebase database structure - need adviceFirebase 数据库结构 - 需要建议
【发布时间】:2016-12-16 13:47:18
【问题描述】:

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

让我们从应用描述开始

该应用旨在为图书阅读体验提供跟踪和社交功能,以及创建图书数据库。用户添加书籍,填写书名、作者、语言、页数等基本信息。接下来,这本书在应用程序的列表中可见,用户可以轻松访问书籍信息并保存他/她最近在哪个页面上的信息结束阅读。一本书被标记为已读后,用户获得经验值和徽章。最终,用户将能够浏览朋友的成就、创建排行榜等。

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

  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 格式,以使其更具可读性,如果我失败了,请告诉我。

我希望通过提出这个问题来获得明确的答案,如果我的方法是正确的,或者我应该更改数据库结构中的某些内容以磨练未来的可扩展性和总体性能。

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

提前致谢

【问题讨论】:

  • 不可能对具有完整用例集的数据建模请求给出简短的回答。如果您担心特定的用例,我们可能会提供更好的帮助。推荐阅读:NoSQL data modeling.
  • 感谢您的阅读!但是,正如我非常详细地描述了我的应用程序和用例一样,也许您可​​以判断我通过 id 从用户个人资料中访问书籍和徽章的想法通常是好还是坏?我相信有一种方法可以为我提供的上下文提供答案

标签: ios swift firebase firebase-realtime-database nosql


【解决方案1】:

在我看来,您的书籍和徽章数据模型看起来非常好。它们将对应用中的任何用户公开,并且不会存储任何复杂数据。

现在进入用户对象: 1) 对于这种将发生用户交互的应用程序,您很可能希望通过不存储用户的电子邮件来保护用户的隐私(因为用户对象必须被其他人读取)。电子邮件已经嵌入到用户的身份验证令牌中,因此将其保存到数据库中也是多余的,并且会降低隐私。如果你真的想保存它,你可以创建一个名为“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”。然后很容易查询完成的书籍是什么时候完成的,未完成的书籍是什么时候打开的。 徽章可以这样存储:

badges:
  badge_id:
    get_date:

像这样存储书籍和徽章可以更轻松地根据时间戳进行查询。这是我目前能想到的一切。如果您有任何问题,请告诉我。

【讨论】:

  • 感谢您的承诺,我会考虑您的建议!尽管如此,我还是欢迎其他用户像 Ian 一样分享他们的见解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多