适用于Android应用的Parse.com上的多对多关系

时间:2015-02-01 14:30:16

标签: android database design-patterns database-design parse-platform

我正在考虑开发一个具有向上投票/投票系统的应用程序(就像我们在Stack Overflow中一样)。 我很难建立基地 - 意味着建筑。

假设我有一个包含帖子的列表,在ListView中查看,数据来自数据库(Parse.com db)。每个帖子都有自己的Int列,名为" votes"包含它的票数/票数。

这是我的问题:我绝对希望每个用户只能对每个帖子进行一次投票。我怎么做?如何将每个用户保存在数据库中,以便他只能投票一次?

2 个答案:

答案 0 :(得分:1)

如果您要解决数据库设计级别的问题,这样的事情可能对您有所帮助:
enter image description here

USER {USER_ID}的主键
POST的主键{USER_ID,POST_SEQUENCE_NUMBER}
投票的主键{VOTE_ID}

现在有了独特的约束 vote_table_uc1 = {voter_FK, post_FK}
将满足

  

每个用户只能对每个帖子进行一次投票

具有这种独特约束的平均时间
vote_table_uc2 = {voter_FK != post_FK.USER_ID}
将满足

  

你不能投票给自己的帖子

答案 1 :(得分:1)

正如您在问题中所述,您使用的是Parse.com。我之前没有使用过Parse.com,所以我建议的内容可能无法正常使用,但是在文档中快速搜索引导我访问此链接:https://parse.com/docs/relations_guide#manytomany-jointables

加入表允许您与关系附加的信息(例如投票(-1 / + 1),日期等)有多对多的关系。

这里需要的是2个实体(PostUser),它们应使用连接表Vote进行连接,以跟踪每个用户对该帖子的投票。我会尝试这样的事情:

ParseUser currentUser = getCurrentUser();
ParseObject post = ...  //This is the post where the user is going to vote on.

ParseObject currentVote = new ParseObject("Vote");
currentVote.put("voter", currentUser);
currentVote.put("post", post);
currentVote.put("date", new Date());
currentVote.put("vote", -1); //down-vote
currentVote.saveInBackground();

你可以看到它的发展方向。

我不确定Parse.com如何处理约束,但基于查询界面,您可能希望确保用户在添加投票之前通过运行查询仅在每个帖子上投票一次:

// set up the query on the Vote table
ParseQuery<ParseObject> query = ParseQuery.getQuery("Vote");
query.whereEqualTo("voter", ParseUser.getCurrentUser());
query.whereEqualTo("post", post);

// execute the query
query.findInBackground(newFindCallback<ParseObject>() {
    public void done(List<ParseObject> votes, ParseException e) {
        if(votes.length <= 0) {
            //apply the vote as above
        } else {
            //user already voted
        }
    }
});

希望这有帮助。