我知道这个问题可能被视为基于意见的问题,但是我认为值得讨论正确构建数据库的方法。我在 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(使用前将#替换为@)