Firebase 数据库结构 - 需要建议

2024-04-22

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

让我们从应用程序描述开始

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

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

  Users:
    user_id:121jhg12h12
      email: "[email protected] /cdn-cgi/l/email-protection"
      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 数据库结构这样狭窄的主题中。

提前致谢


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

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

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

  • Outgoing_requests:可由用户自己写入(取消请求)或由具有 request id 的用户写入(接受或拒绝请求)
  • 传入请求:可由用户自己写入(接受或拒绝)或由具有请求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:

像这样存储书籍和徽章使得根据时间戳进行查询变得更加容易。目前我能想到的就这些了。如果您有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 数据库结构 - 需要建议 的相关文章

  • Xcode:将信息从 UITableViewController 传递到 UIViewController

    我有一个 UIViewController 它应该根据 UITableViewController 中按下的单元格向我显示详细信息 目前我正在给他们讲一个续集 override func prepare for segue UIStoryb
  • 领域对象返回 nil (Swift)

    我有一个自定义多边形对象 因此我可以将地图叠加保存到领域 我能够成功创建这个对象 但是当我想检索 var 多边形对象时 它返回 nil 当我打印多边形对象时 它可以很好地打印出所有数据 这是打印内容的示例 CustomPolygon nam
  • UITableView:popViewController 并将行索引保留到父控制器中?

    我有以下配置 一个视图控制器父控制器包含一个TableView父表带有自定义单元格 每个单元格显示 2 个标签 一个视图控制器子控制器包含一个TableView子表 当用户单击controllerParent的某个单元格时 会显示此视图 c
  • 使用单个共享后台线程进行 iOS 数据处理?

    我有一个应用程序 可以从网络下载大量资源 并对每个资源进行一些处理 我不希望这项工作发生在主线程上 但它非常轻量级且优先级低 因此所有这些都可以真正发生在同一个共享工作线程上 这似乎是一件好事 因为设置和拆除所有这些工作线程都需要工作 没有
  • 轻量级核心数据迁移后,如何为现有实体的新属性设置默认值?

    我已经成功完成了核心数据模型的轻量级迁移 我的自定义实体 Vehicle 收到了一个新属性 tirePressure 它是 double 类型的可选属性 默认值为 0 00 当从商店中获取 旧 车辆 在迁移发生之前创建的车辆 时 其 tir
  • 如何获取UIImage的大小(KB)

    我从以下位置获取图像didFinishPickingMediaWithInfo UIImage originalImage UIImage info valueForKey UIImagePickerControllerOriginalIm
  • iOS:如何创建并绘制(并保存)大于屏幕的图像?

    我们正在创建一个 iOS 照片应用程序 为此 我们必须创建动态大小的图像 最大约为 2500x1600 像素 创建此图像后 我们希望以相当快的速度在大图像之上绘制较小的图像 正如我们所看到的 问题在于不可能获得大于屏幕分辨率的上下文 该调用
  • 前导点的自动完成功能无法快速工作

    当我尝试在 swift 中使用 前导点语法 时 我没有得到任何自动完成建议 是否没有实现此自动完成功能 或者是我的 Xcode 版本 6 3 1 有问题 例如 当我尝试这样的事情时 let col UIColor whiteColor 在我
  • 如何将已编译的 IPA 复制到我的 iOS 设备?

    我有一个开发者帐户 并且习惯于编写自己的应用程序 最近 与我合作的另一位开发人员希望我在我的设备上测试他们的应用程序 他已经将我的设备 ID 添加到他的配置文件中 并为我提供了编译后的 IPA 但我不知道如何将此 IPA 复制到我的 iOS
  • 检查与 NSURLConnection 连接的有效 IP

    我目前有一个应用程序 它尝试根据我正在与之通信的某些服务器打开网络视图 但是 我允许用户输入自己的服务器 IP 以防 iphone ipad 和服务器 或其他设备 不在同一网络上 但是 我尝试使用 NSURLConnection 来检测是否
  • 原生编程对于移动开发有何优势?

    我需要为一家公司在一些主要的移动操作系统上开发应用程序 特别是 iOS Android 和 WP7 我最初计划为三种不同的操作系统编写三个独立的应用程序 每个应用程序都使用本机 SDK 然而 这样做有什么好处吗 有许多可用的跨平台工具 Se
  • 将泛型与 Firebase snapshot.getValue() 结合使用的最佳实践

    TL DR 如何正确使用 Firebase DataSnapshot getValue 的泛型类 用例 我想使用 Firebase 为我的所有实体 其中一堆 实现一个通用远程数据源类 当监听数据更改时 我想从 datasnapshot 获取
  • 使用iOS类别创建新颜色

    我想创造一些新的UIColor我的应用程序中始终使用的 s RGB 有时会稍微调整 确切的颜色阴影正在争论中 目前 我必须从 RGB 创建新颜色 并且代码遍布各处并重复 有没有更好的方法可以创建一种新的颜色并在我的应用程序中使用它 UICo
  • 无法在 Swift 3 / iOS 10 中触发 continueUserActivity

    注意 我已经弄清楚了大部分内容 请参阅最后的更新 还是有些迷茫 我正在尝试在 Swift 3 下的 Xc8b6 中实现 NSUserActivity 处理 但处理程序协议方法的方法签名遇到问题 在当前的文档中 该方法据说是 func app
  • IQKeyboardManager 从 UITextField 导航到 UITextView

    IQKeyboardManager在键盘上方的工具栏中提供箭头以从一个跳转UITextField到另一个 但我正在寻找是否可以在混合之间跳转UITextFields and UITextViews 我知道完成此任务的正常程序 但我有兴趣知道
  • 为 MoonAPNS 创建 p12 文件时卡住了

    我在创建 p12 证书时遇到一些问题 我之前创建了一个带有推送通知的应用程序 效果很好 应用程序获取用户设备 ID 并将其保存到数据库中 我已将代码添加到我的新应用程序中 并进行了与新应用程序一起使用的修改 从日志来看 它的工作方式似乎与我
  • 适用于 VPN 的 iOS 专用 API

    我正在寻找一些私有 API 来启动在 设置 应用程序中配置的 VPN 连接 有人有什么建议我可以在哪里找到它们吗 我唯一发现的是 ManagedConfiguration framework 这是正确的起点吗 没有任何文档 这有点困难 附
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • SpriteKit 中的攻击按钮

    我对 Xcode 有点陌生 一直在为我的班级制作 2d 游戏 我已经有一段时间遇到按钮问题了 我刚刚找到了为什么我的跳跃按钮不起作用的解决方案 但我还有一个攻击按钮 我设置了代码 使按钮显示在屏幕上并在按下时更改其图像 但是 我不知道要放入
  • iOS 所需的设备功能自动对焦相机

    我有一个 iOS 应用程序 我在其中设置Required Device Capabilities配置设置需要两者still camera and auto focus camera因为它需要在具有更好的自动对焦相机传感器的新一代设备上运行

随机推荐

  • Xcode 11.4 / iOS13.3.1 无法检查应用程序包

    Details Unable to install wtsp ios Domain com apple dt MobileDeviceErrorDomain Code 402653103 Could not inspect the appl
  • javascript 无法在 IE9 中调用

    我创建了一个文本框并写道onfocus getFocus 现在我用javascript编写了函数 function getFocus alert Hello I Got Focus 问题是在 IE8 中它工作得很好 但在 IE9 中警报没有
  • 如何禁用 IE8 中文本区域的默认滚动条?

    我正在浏览一些旧网站 其中有一个联系表单 并且在 IE8 中 即使没有内容 我的文本区域也始终会显示一个垂直滚动条 在 Firefox 中 直到文本区域中的内容达到认为有必要的高度时 它似乎才会使垂直滚动条存在 我在旧网站上设置了输入框的样
  • 将 NSArray 转换为 NSMutableArray [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如上 了解一下会有帮助的 谢谢 这里有两个选项 NSMutableArray createMutableArray1 NSArray ar
  • 它当前正被另一个 Gradle 实例使用

    我想做一些基本的功能 我正在命令行中运行 构建它 我指的是用户指南 http www gradle org docs current userguide userguide html 并且 做一些简单的任务 当我开始运行简单任务时 它已成功
  • 从线程接收数据后pyqt主窗口不断崩溃

    我有一个 QMainWindow 启动 QThread 并等待来自网络的数据 当收到任何数据时更新 UI 问题是 它有时会崩溃 有时不会 我所做的就是启动它并等待数据 这是线程类 class ListenerThread QtCore QT
  • 将多选列表框中的 SelectedItems 与 ViewModel 中的集合同步

    我在使用 prism 的 SL3 应用程序中有一个多选列表框 并且我的视图模型中需要一个集合 其中包含列表框中当前选定的项目 视图模型对视图一无所知 因此它无法访问列表框控件 另外 我需要能够从视图模型中清除列表框中的选定项目 不知道如何解
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • 使用 ngx-mat-file-input 从 Angular 将文件上传为 multipart/form-data

    我在用着ngx mat file input 0 检索用户输入的文件 我想将其上传到服务器 端点需要一个多部分文件 我怎样才能做到这一点 0 https www npmjs com package ngx material file inp
  • 内置模块计算最小公倍数

    我目前正在使用一个接受两个数字并使用循环来查找这些数字的最小公倍数的函数 def lcm x y This function takes two integers and returns the L C M Choose the great
  • MySQL order by 在 group by 之前

    这里有很多类似的问题 但我认为没有一个能充分回答这个问题 我将从当前最流行的继续question https stackoverflow com questions 5140785 mysql order before group by如果
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 将 A => M[B] 转换为 M[A => B]

    对于一个单子M 是否可以转A gt M B into M A gt B 我尝试过遵循这些类型 但没有成功 这让我认为这是不可能的 但我想我还是会问 另外 搜索 Hooglea gt m b gt m a gt b 没有返回任何东西 所以我没
  • Perl:函数参数不足

    我是 Perl 的新手 目前正在尝试理解提到的错误消息 我有这段代码 仍然主要用于测试目的 usr bin perl use strict use warnings my info autor gt Karryanna jazyk gt c
  • Android ACTION_SHUTDOWN 广播不起作用

    Code public class ShutdownReceiver extends BroadcastReceiver private static final String TAG ShutdownReceiver Override p
  • Javascript“this”被事件监听器覆盖[重复]

    这个问题在这里已经有答案了 我可能做错了什么 但在尝试将一些面向对象编程应用于 Javascript 时 我发现了一些有趣的行为 考虑以下 function Bug element this focusedCell null element
  • jquery导航

    我正在为网站登陆页面创建一个简单的导航 它将用户引导到客户业务的两侧之一 基本上包括当您滚动到一侧时屏幕被分成两半 另一侧淡出 My code HTML div a href retail html Retail a a href resi
  • 使用 C# 以 PDF 形式动态存储和发送 SSRS 报告

    我在 SSRS 中有一份报告 它以 a 作为参数SalesRepCode and Email生成 PDF 收据 如果我使用报告查看器 它就会正常工作 使用 C 我想为每个存在的销售代表自动生成 PDF 一旦呈现 PDF 我想将其存储在文件夹
  • 无法在 Simulator XCode 6.0 中运行应用程序

    从 XCode 5 0 迁移到 XCode 6 0 后 项目无法运行并出现以下错误 An error was encountered while running Domain FBSOpenApplicationErrorDomain Co
  • Firebase 数据库结构 - 需要建议

    我知道这个问题可能被视为基于意见的问题 但是我认为值得讨论正确构建数据库的方法 我在 Swift 中开发 iOS 应用程序 并决定使用 firebase 作为我的后端服务 让我们从应用程序描述开始 该应用程序旨在为图书阅读体验提供跟踪和社交