共享数据的数据库设计

时间:2017-09-16 00:14:31

标签: sql json node.js database firebase

我有一个有趣的问题。我目前正在创建一个涉及大量共享数据的应用。我的意思是,在应用程序中,用户可以创建组,在这些组中,他们可以存储组中其他人也可以看到的重要数据。我想有效地存储这些共享数据,但我不确定使用哪种数据库。一个是JSON树格式还是一个基于查询的搜索?

如果有优势,我会欣赏一个例子。我已经熟悉Firebase了。

1 个答案:

答案 0 :(得分:2)

我认为这一切都取决于您的应用程序的功能以及您需要访问的数据类型,但考虑到一个包含用户,群组,对话和消息的简单应用程序,我个人会对我的数据进行非规范化处理使用这样的数据库结构:

root/
|___ users/
|      |___ userID1
|              |___ name : user_name
|              |___ email : user_email
|              |___ picUrl : user_picture_url
|              |___ conversations
|                       |___ userConversationID1 : true                    
|                       |___ userConversationID2 : true
|                        ...
|              |___ groups
|                       |___ groupID1 : true                    
|                       |___ groupID2 : true
|                        ...
|              |___ notificationTokens
|                       |___ token1 : true                       
|                       |___ token2 : true
|                        ...
|
|___ groups/
|      |___ groupID1
|              |___ name : group_name
|              |___ thumbnailUrl : group_thumbnail_url
|              |___ conversations
|                       |___ groupConversationID1 : true                    
|                       |___ groupConversationID2 : true
|                        ...
|              |___ members
|                       |___ groupMemberID1 : true                    
|                       |___ groupMemberID2 : true
|                        ...
|
|___ conversations/
|      |___ conversationID1
|              |___ messageID1 : true
|              |___ messageID2 : true
|              |___ messageID3 : true
|              |___ messageID4 : true
|               ...
|      ...
|
|___ messages/
|      |___ messageID1
|              |___ text : message_text
|              |___ sender : message_sender
|              |___ receiver : message_receiver
|              |___ timestamp : message_timestamp
|      ...
|
|___ notifications/
|        ...
|        ...
|

虽然这种结构确实会复制某些数据,但我相信它可以让您更轻松地查找特定于用户或特定于组的数据。

例如,如果您想获得一个简单的

组的所有成员的列表
Database.database().reference().child("group").child(groupId).child("members").observeSingleEvent(of: .value, with: { (snapshot) in
    // ...
 })

就足够了,而不是嵌套结构,最终可能难以获得您正在寻找的数据。

如果您想让我知道您计划在应用中使用哪种功能,我可能会更具体。无论如何,我很乐意帮助你。)

<强>更新

关于您应该选择哪个数据库(关系数据库与Firebase),我会说它与您的应用程序的功能直接相关。例如,如果您需要对大量数据进行排序和过滤(按年龄,国家和性别过滤用户),那么您可能更适合使用SQL数据库,因为您只能轻松过滤您正在查找的用户对于。虽然并非不可能,但使用Firebase进行此操作会花费更多时间(和数据)。

现在,如果您构建一个实时聊天,并且不需要为您的应用程序设置太复杂的数据库结构,那么很明显Firebase将是您正在寻找的那个,因为我认为它使它变得非常快速和简单使用。