【发布时间】: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