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 数据库结构 - 需要建议 的相关文章

  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • 在 iOS 应用程序中拨打电话

    我有一些代码尝试在应用程序中进行调用 但它似乎不起作用 UIApplication myApp UIApplication sharedApplication NSString theCall NSString stringWithForm
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • 谷歌云功能发送重复通知

    我有一个发送主题通知的 gcf 我从管理 Android 应用程序触发该功能 一切都按预期工作 但突然该函数发送通知两次 有时三次 谷歌云上的函数日志显示该函数已发送一条通知 它只打印一行 定制发送成功 但 Android 应用程序会收到多
  • $0 和 $1 在 Swift 闭包中意味着什么?

    let sortedNumbers numbers sort 0 gt 1 print sortedNumbers 谁能解释一下什么 0 and 1在斯威夫特中意味着什么 另一个样本 array forEach actions append
  • 将类型传递给通用 Swift 扩展,或者理想情况下推断它

    说你有 class Fancy UIView 你想找到所有兄弟姐妹Fancy意见 没问题 https stackoverflow com q 37232743 294884 for v UIView in superview subview
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 如何删除 UITableView 中的缩进?

    首先 我对此很陌生 我很可能忘记了一些非常简单的事情 问题 我正在制作一个应用程序 在 a 中显示来自 imgur com 的随机图像tableView 由于某种原因 所有单元格都会缩进少量 如下图所示 我摆弄了许多设置storyboard
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 未知异常和崩溃

    当我尝试快速滚动表格视图或从远程重新加载数据时 我的应用程序崩溃了 当我先进行远程获取然后滚动表格视图时 一切似乎都工作正常 我不知道下面的崩溃日志意味着什么 它只是有时工作正常 有时崩溃 Incident Identifier 710A1
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • 当应用程序进入前台时,如何重新启动基于块的动画?

    我有以下基于块的动画 UIView animateWithDuration 0 5f delay 0 0f options UIViewAnimationOptionRepeat UIViewAnimationOptionAutorever
  • NSPredicate IN 从数组元素查询

    对于一个古怪的标题表示歉意 我有一个 Int 数组 我想定义一个 NSPredicate 来过滤掉 connectionType 等于数组中包含的值的项目 所以基本上是这样的 fetchRequest predicate NSPredica
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • 从现有坐标地图套件中查找最近的位置

    我正在为拥有多家商店的客户开发 iPhone 应用程序 目标 C 我有数组中所有商店 20 的坐标 纬度 长 目前我正在考虑循环遍历商店坐标数组并获取从用户当前位置到商店位置的距离 然后将它们添加到数组中并按最小距离进行排序 这是正确的方法
  • UICollectionView setLayout:animated: 不保留 zIndex

    我注意到打电话时setLayout animated in a UICollectionView要在两个布局之间切换 当前可见的单元格不遵循zIndex它的布局属性已设置在layoutAttributesForItemAtIndexPath
  • 如何在 Swift 2.0 中使用 stringByAddingPercentEncodingWithAllowedCharacters() 作为 URL

    我在 Swift 1 2 中使用过这个 let urlwithPercentEscapes myurlstring stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding
  • 在 Object 子类及其自己的子类上实现ignoreProperties()

    我是领域新手 我正在使用继承自 Object 的基类以及该基类的自定义子类创建模型 我的模型要求基类通过覆盖静态来声明一些属性被忽略ignoredProperties 方法 当尝试在某些基类子类上重写该方法时 我收到一个 Swift 编译器
  • Fitbit oauth2 公共 API 停止工作。给出错误 - 抱歉,这不是你..是我们

    几个月前 我准备了一个关于 Fitbit oauth2 公共 API 的演示 其中我使用特定用户登录并获取他的活动 一切正常 但最近 我打开演示并尝试使用同一用户登录 但它没有登录并反复出现此错误 我尝试更改在 Fitbit 上注册的演示应
  • Firebase - 有没有办法查看有多少人安装了该应用程序?

    Parse 支持安装功能 我不确定 firebase 是否也支持 但在 Google 中挖掘了几个小时后 我无法找到有关如何在 Firebase 中查看 计算用户安装的重要信息 有没有办法计算 Firebase 中的用户安装量 或者甚至还有

随机推荐

  • 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 作为我的后端服务 让我们从应用程序描述开始 该应用程序旨在为图书阅读体验提供跟踪和社交