Firebase数据库结构 – 需要build议

我知道这个问题可能被看作是一个基于意见的问题,但我认为值得讨论如何正确构build数据库。 我在Swift的iOS应用上工作,并决定使用Firebase作为我的后端服务

我们从应用程序描述开始

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

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

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

通过提出这个问题,我想达到的目的是为了获得一个明确的答案,如果我的方法是正确的,还是应该改变数据库结构中的某些东西来磨练将来的可伸缩性和一般性能。

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

提前致谢

在我看来,你的书和徽章数据模型看起来完全没问题。 他们将被公开给应用程序中的任何用户,而不会存储任何复杂的数据。

现在到达用户对象:1)对于这种types的应用程序,用户交互将发生,你很可能希望通过不存储他们的电子邮件来保护你的用户的隐私(因为用户对象必须是可读的其他)。 电子邮件已经embedded到用户的身份validation令牌中,因此将其保存到数据库中也是多余的,并且减less了隐私。 如果你真的想保存它,你可以创build一个名为“user_private”的新对象,让它只能被用户自己读取。

2)对于有朋友列表的应用程序,您还需要一个朋友请求系统。 为此,我build议创build一个名为“outgoing_requests”的密钥,即所有发送给其他用户(w / userID)的朋友请求仍然不完整。 另外,创build一个名为“incoming_requests”的密钥,其中包含其他用户向您发送的请求。 这是你将用来创build一个朋友请求页面,并允许用户接受或拒绝。 这造成了一些JSON规则的复杂性。 我会这样说:

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

3)您也可能会根据时间戳查询用户的书籍。 因此,我会把它放在一边,所以这很容易实现(一个数组将不起作用,因为用户可能会开始阅读他们一段时间没有打开的书,而且sorting会混淆)。 你可以像这样存储用户的书籍:

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

然后,在状态下,存储“完整”或“不完整”。 如果不完整,将使用“lastopened_date”和“current_page”。 如果完成,将使用“start_date”和“finish_date”。然后,可以很容易地查询完成的书籍的完成date,以及根据上次打开的date查询未完成的书籍。 徽章可以像这样存储:

 badges: badge_id: get_date: 

像这样存储书籍和徽章使得基于时间戳的查询变得更容易。 这是我现在可以想到的一切。 如果您有任何问题,请告诉我。