如何构建数据

时间:2014-04-23 20:11:27

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

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

我向用户页面显示20个语句,并且每个语句都标记为"同意"或者"不同意"。 我需要以有效的方式存储这些协议。这些陈述将重复出现,因此每当用户看到他已经同意的陈述时,它应该显示在陈述旁边的页面上。此外,应该有一个选项可以点击一个陈述,看看所有同意/不同意的人。

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

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

选项1 :拥有一个如下所示的UserAgreement对象:

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

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

选项2 :与以前相同的UserAgreement对象,但不是查询用户X,而是将所有这些对象存储在用户对象中:

public class User {
  Set<UserAgreement> userAgreements; 
}

当我显示页面时,我获取所有这些页面并循环遍历它们以查看标记了哪些语句。将这里增加的开销添加到用户对象中是否值得从选项1中删除查询?如果达到1000x的协议怎么办?

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  

&#34;所以每当用户看到他已经同意的陈述时,它应该显示在声明旁边的页面上。&#34;

每次加载20个语句时,如果每个语句都有一个与该语句一致的ID列表,则可以根据该用户的id是否存在来确定当前用户是否同意在那些名单中。你不需要布尔值; id的存在决定了真/假。

  

&#34;此外,应该有一个选项可以点击一个陈述,并查看所有同意/不同意的人。&#34;

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

  

&#34;换句话说,我总是需要知道某个用户是否标记了某个语句。这是一个将要执行很多次的查询,所以它必须尽可能快。&#34;

由&#34; List.contains(对象o)&#34;决定对象是userId,返回值是true还是false,具体取决于id是否在列表中。

  

&#34;查询标记特定声明的用户不太常见,如果它不会那么快就可以。&#34;

这与上述观点相同。获取属于某个Statement的列表然后&#34; List.contains(object o)&#34;