【问题标题】:Many-to-many relations on Parse.com for Android appParse.com for Android 应用程序上的多对多关系
【发布时间】:2015-02-01 14:30:15
【问题描述】:

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

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

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

【问题讨论】:

  • 如果不想让用户投票赞成/反对两次,这意味着保留数字的简单 int 是不够的。您必须将每个单独的用户与帖子上的投票相关联。因此用户和帖子将与另一个表/关系连接以跟踪投票。
  • 没错。那是我无法理解的部分。我是否需要每个用户都指向我的 Posts 表中的每一行?或者也许保存他喜欢的每个帖子 ID?这意味着随着时间的推移,每个用户文件都会变得很重,不是吗?

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


【解决方案1】:

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

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}
会满足

你不能投票给你自己的帖子

【讨论】:

  • 嘿莫申。谢谢,但我很难理解这一点。
  • 嗨,模型或约束可以理解吗?
  • 我了解的模型。我做了一些事情。这是我不明白的约束。我发现了这个问题stackoverflow.com/questions/7487476/… 我猜你的建议很相似。它基本上意味着:创建 3 个表:User、Post 和 Like。 User 和 Post 有 ID,Like 有一个指向 User 行和 Post 行的指针。
【解决方案2】:

正如您在问题中指出的那样,您正在使用 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
        }
    }
});

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多