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 个实体(Post
和 User
),它们应该使用一个 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
}
}
});
希望对您有所帮助。
我正在考虑开发一个具有赞成票/反对票系统的应用程序(就像我们在 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 个实体(Post
和 User
),它们应该使用一个 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
}
}
});
希望对您有所帮助。