【问题标题】:How to structure data如何构造数据
【发布时间】:2014-04-23 20:11:26
【问题描述】:

我无法决定如何构建我的模型。

我向用户页面展示了 20 条陈述,对于每一条他都标记为“同意”或“不同意”。 我需要以有效的方式存储这些协议。声明会重复,所以每当用户看到他已经同意的声明时,它应该显示在声明旁边的页面上。此外,应该有一个选项可以单击声明并查看所有同意/不同意该声明的人。

所以换句话说,我总是需要知道某个用户是否标记了某个语句。这是一个将多次执行的查询,因此必须尽可能快。查询哪些用户标记了特定的语句不太常见,如果不会那么快也可以。

所以这些是我想出的选项,我不确定哪个更有意义:

选项 1:具有如下所示的 UserAgreement 对象:

public class UserAgreement {
  User user;
  Statement statement;
  Boolean agree;
}

当我显示页面时,我查询用户 X 的所有协议并循环查看他标记了哪些语句。 (或者也许对于用户+语句的每个语句查询?)

选项 2:与之前相同的 UserAgreement 对象,但不是查询用户 X,而是将它们全部存储在用户对象中:

public class User {
  Set<UserAgreement> userAgreements; 
}

当我显示页面时,我会获取所有这些并循环它们以查看标记了哪些语句。此处添加到用户对象的开销是否值得摆脱选项 1 中的查询?如果我达成 1000 倍的协议怎么办?

选项3:在用户对象中有一个协议列表,不需要UserAgreement对象:

public class User {
  Set<Statement> agreed;
  Set<Statement> disagreed;
}

当我显示用户时,我很容易检查语句是否在任何一组中。但是我可以反过来查询所有同意特定声明的用户吗?再说一次,如果我达成 1000x 协议怎么办?开销是多少?

选项 4:还有其他想法吗?

【问题讨论】:

  • 您的陈述的性质是什么?它们是一成不变的静态值(如法律内容),还是您需要处理可能的新声明?它还会影响您对数据建模的方式。

标签: java google-app-engine google-cloud-datastore objectify


【解决方案1】:

在我看来,如果 Statement 对象通过唯一 id 包含与用户的关系,那么您的所有问题都会得到解决。

“所以每当用户看到他已经同意的声明时,它应该显示在该声明旁边的页面上。”

每次加载 20 条语句时,如果每个语句都有一个(例如)同意该语句的 id 列表,您可以根据这些列表中是否存在该用户的 id 来确定当前用户是否同意。这里不需要布尔值; id的存在决定了真假。

“此外,应该有一个选项可以单击声明并查看所有同意/不同意该声明的人。”

同样,如果每个语句都有与其一致的 id 列表,您可以显示该列表,将这些 id 链接到与该 id 关联的用户对象的 userName 之类的东西。

“也就是说,我总是需要知道某个用户是否标记了某个语句。这是一个会执行很多次的查询,所以它必须尽可能快。”

由“List.contains(Object o)”确定,其中对象为 userId,返回值为 true 或 false,具体取决于该 id 是否在列表中。

“查询哪些用户标记了特定的语句不太常见,如果不会那么快也可以。”

这与上面的观点相同。获取属于某个Statement的列表然后“List.contains(object o)”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2013-02-22
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多