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

Many-to-many relations on Parse.com for Android app

我正在考虑开发一个具有赞成票/反对票系统的应用程序(就像我们在 Stack Overflow 中所拥有的那样)。 我很难构建基础 - 即架构。

假设我有一个包含 post 的列表,在 ListView 中查看,数据来自数据库 (Parse.com db)。每个 post 都有自己的名为 "votes" 的 Int 列,其中包含它拥有的 up-votes/down-votes 的数量。

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

如果您要解决数据库设计层面的问题,下面的内容可能会对您有所帮助:

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

现在具有唯一约束
vote_table_uc1 = {voter_FK, post_FK}
将满足

every user to be able to up-vote only once to each post

同时具有此唯一约束
vote_table_uc2 = {voter_FK != post_FK.USER_ID}
会满足

You can not vote you own post

正如您在问题中所指出的那样,您正在使用 Parse.com。我以前没有使用过 Parse.com,所以我的建议可能无法立即使用,但在文档中快速搜索后我找到了这个 link:https://parse.com/docs/relations_guide#manytomany-jointables

Join-tables 允许您与关联的信息建立多对多关系(例如投票 (-1/+1)、日期等)

你在这里需要的是 2 个实体(PostUser),它们应该使用一个 join-table Vote 来连接,以跟踪投票每个用户都朝向 post。我会尝试这样的事情:

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 如何处理约束,但根据查询界面,您可能希望确保用户只对 运行 的每个 post 投票一次添加投票前的查询:

// 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
        }
    }
});

希望对您有所帮助。