有效地检索与一组id中的任何元素匹配的实体

时间:2010-10-06 15:13:53

标签: google-app-engine database-design data-structures google-cloud-datastore

我正在编写软件以向多个类别的人提供反馈。例如,我可能有30名员工和40个评估标准(例如“准时到达”,“礼貌”,“似乎刷牙”等)。在任意时间,主管可以提交一条反馈,例如“员工3获得5/5标准8(他闻起来很棒)”或“员工10获得1/5标准12(他只是称客户为白痴) )“。

我的想法是通过保留userId和standardId字段,单独存储这些小部分反馈,链接到员工和标准。

当我想查看所有30名员工和40个标准的反馈时,问题出现了。我目前的方法需要1200个查询才能检索所有数据。我正在寻找更好的方法。我正在使用google appengine数据存储区,这是一个非关系数据库。

我一直在考虑的事情,我欢迎反馈:

  1. 我可以将反馈存储在网格中,每个用户按行和每个标准列。然后,单个查询获取所有数据(优于1200),但输入新数据变得更加困难(获取网格,更新正确的位,存储网格)并且用户集或标准集中的更改变得更加复杂(如果我在中间添加标准,则需要更新此网格)。此外,一些查询变得更加困难 - 我再也无法轻易搜索某个日期或某个主管输入的评估。

  2. 我可以在一个无组织的列表中存储某个(一组用户x组标准)的所有反馈,用一个查询获取它,然后在我自己的代码中对其进行排序。这需要我遍历1200个条目,但这比整个系统中的所有数据都要快1200次查询(对于其他用户组和不相关的标准,可能有许多很多不相关的数据)。

    < / LI>

    所以,我的问题的简短版本是:我应该如何存储这些数据,以便快速检索大型子集并快速插入各个反馈片段之间的最佳平衡?

1 个答案:

答案 0 :(得分:1)

可能能够使用RelationIndex执行此操作。根据您希望用户查看和查询数据的准确程度,它应该可以正常工作。

这个想法很简单,基本上你会为每个员工存储一份“标准”清单。并且可能是每个标准的员工列表。然后你就可以提出问题,例如所有员工“闻起来都不错”。

因为你有每个标准的分数,你可能想做一些事情,比如将“得分”和“标准数字”作为一对存储在列表中(“3:12”),这样你就可以找到每个人都有标准12分为3分。

修改:根据评论更新。

听起来你需要处理一些不同的问题。首先,您需要处理编辑和维护数据。其次,您需要处理查询数据。第三,您将需要处理显示数据。

为了有效地查询数据,您可能需要一些类似于我最初建议的方法。什么更常见,编辑或查看数据?这将影响您设置模型的方式。

如果您只与30或40名员工以及30或40个标准打交道,也许您可​​以使用以下内容:

class Evaluations(db.Model):
    period = db.StringProperty()
    standards = db.TextProperty()
    scores = db.TextProperty()

class EvaluationsIndex(db.Model):
    index = db.StringListProperty()

使用Evaluations上的standards属性存储评估的标准列表。然后将您的员工标准分数网格存储在分数属性中。显然,您需要序列化标准列表和评估网格,可能使用类似JSON的东西。如上所述使用EvaluationsIndex模型。

通过这个(或类似的东西),你可以轻松编辑,非常容易显示,并支持查询。

您可以添加其他模型来跟踪哪位主管进入评估及其笔记。