我的经验是使用SQL,但是我正在学习解析服务器数据管理,在下面的示例中,我演示了如何使用SQL来表示当前存储在解析服务器类中的数据。我正在尝试向所有用户展示他们上载了多少图像的计数,以及他们喜欢某个应用程序的数量,该应用程序使用户可以上载图像,并且他们还可以滚动浏览并喜欢其他人的图像。我将上传图像的用户的ID存储在图像表中,并将数组列存储在所有喜欢它的ID的图像表中。
使用SQL,我将其标准化为3个表(用户,图像,user_x_image),加入了这些表,然后汇总了该结果。但是我正在尝试使用解析服务器来学习执行此操作的正确方法,我的理解是最佳实践是按照下面的方式构造数据。我要做的是制作一个“排行榜”,显示用户上传了最多图片或喜欢最多图片的用户,以激发参与度。甚至公正地链接到如何加入/聚合解析数据集的示例也将非常有帮助。如果我不清楚要达到的目标,请告诉我您的评论,然后添加更新。
-- SQL approximation of data structured in parse
create volatile table users
( user_id char(10)
, user_name char(50)
) on commit preserve rows;
insert into users values('1a','Tom');
insert into users values('2b','Dick');
insert into users values('3c','Harry');
insert into users values('4d','Simon');
insert into users values('5e','Garfunkel');
insert into users values('6f','Jerry');
create volatile table images
( image_id char(10)
, user_id_owner char(10) -- The object Id for the parse user that uploaded
, UsersWhoLiked varchar(100) -- in Parse class this is array of user ids that clicked like
) on commit preserve rows;
insert into images values('img01','1a','["4d","5e"]');
insert into images values('img02','6f','["1a","2b","3c"]');
insert into images values('img03','6f','["1a","6f",]');
-----------------------------
-- DESIRED RESULTS
-- Tom has 1 uploads and 2 likes
-- Dick has 0 uploads and 1 likes
-- Harry has 0 uploads and 1 likes
-- Simon has 0 uploads and 1 likes
-- Garfunkel has 0 uploads and 1 likes
-- Jerry has 2 uploads and 1 likes
-- How to do with normalized data structure
create volatile table user_x_image
( user_id char(10)
, image_id char(10)
, relationship char(10)
) on commit preserve rows;
insert into user_x_image values('4d','img01','liker');
insert into user_x_image values('5e','img01','liker');
insert into user_x_image values('1a','img02','liker');
insert into user_x_image values('2b','img02','liker');
insert into user_x_image values('3c','img02','liker');
insert into user_x_image values('1a','img03','liker');
insert into user_x_image values('6f','img03','liker');
-- Return the image likers/owners
sel
a.user_name
, a.user_id
, coalesce(c.cnt_owned,0) cnt_owned
, sum(case when b.relationship='liker' then 1 else 0 end) cnt_liked
from
users A
left join
user_x_image B
on a.user_id = b.user_id
left join (
sel user_id_owner, count(*) as cnt_owned
from images
group by 1) C
on a.user_id = c.user_id_owner
group by 1,2,3 order by 2
-- Returns desired results
答案 0 :(得分:0)
首先,我假设您正在运行带有MongoDB数据库的Parse Server(Parse Server还支持Postgres,它可以使关系查询的工作变得简单一些)。因此,需要特别注意的是,除了Parse Server在其API中实现关系功能之外,实际上我们是在谈论幕后的NoSQL数据库。因此,让我们来看看这些选项。
选项1-非规范化数据
由于它是NoSQL数据库,所以我希望有第三个集合称为LeaderBoard。您可以将afterSave触发器添加到UserImage类,并使LeaderBoard始终更新。当您需要数据时,可以进行非常简单而快速的查询。我知道,对于经验丰富的SQL开发人员来说,使用非规范化的数据听起来有点奇怪,但是如果您在此集合中读取的次数多于写入的次数,那么从性能上来说,这是最佳选择。
选项2-汇总
MongoDB支持聚合(https://docs.mongodb.com/manual/aggregation/),它具有一个称为$ lookup(https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)的管道阶段,您可以使用该阶段来使用单个api调用/数据库操作执行查询。 Parse Server在其API和JS SDK(https://docs.parseplatform.org/js/guide/#aggregate)中也支持聚合,但不幸的是,并非直接来自Swift中的客户端代码,因为此操作需要Parse服务器中的主密钥。因此,您将需要编写一个云代码函数来为您执行聚合查询,然后从您的Swift客户端代码中调用此云云函数。