我们正在开发一个应用程序,数百万用户将同时输入信息。假设应用程序允许人们对他们想要居住的地理区域进行评级。允许每个参与者使用从0到10的十进制值对每个区域进行评级。每个人都属于基于性别等属性的一个或多个群体,以及自认为活跃或享受文化的人。
每次评分时,我们都需要有一个视图,显示每个区域/组的平均评级。我知道大多数DB都有一个“平均”函数,但是为了我们的目的,我们需要能够使用我们自己的函数,因为我们可以使用几何平均值而不是算术平均值。
下面是一些可能使用的表。注意:为了简洁起见,i没有包含关系表PeopleGroups,该表映射一个人所属的组。
Regions People Groups RegionScoresByPerson
+-----+------------+ +-----+-------+ +-----+----------+ +-----+-----+-------+
| RID | NAME | | PID | Name | | GID | Name | | RID | PID | Score |
+-----+------------+ +-----+-------+ +-----+----------+ +-----+-----+-------+
| 1 | Flordia | | P1 | Alice | | G0 | Everyone | | 1 | P1 | 6 |
| 2 | California | | P2 | Bob | | G1 | Women | | 1 | P2 | 8 |
+-----+------------+ | P3 | Frank | | G2 | Men | | 1 | P3 | 3 |
| P4 | Mary | | G3 | Active | | 1 | P4 | 2 |
+-----+-------+ | G4 | Culture | | 1 | P1 | 7 |
+-----+----------+ | 1 | P2 | 5 |
| 1 | P3 | 8 |
| 1 | P4 | 2 |
+-----+-----+-------+ 我们当前的实现使用了一组类似的表来存储评级,但我们并不实时计算平均值。当我们需要结果时(例如,给我显示加州女性的平均分数),我们必须把所有的信息提取到内存中,并手动运行计算。
我想知道如何利用数据库技术,如视图、触发器、存储过程等,向我展示一个简单的表,使我能够获得人员和组的分数,这样我们就不必手动计算了。
我想要一些表,如下所示,其中所有内容都由DB处理。RegionScoresByPerson或组表上的任何插入、更新、删除操作将自动反映在此表中。如果不明显,则标记有*计算行的行。在这种情况下,我使用的是一个简单的算术平均值,但是我的设计应该允许任何类型的函数。
EID代表实体ID (个人或团体)
除了决定如何构建这样的视图之外,我还不确定如何为People和Groups使用什么类型的数据类型(和索引)。我想我希望索引是整数,但这会阻止我创建下面的表,因为我无法区分Person 1和Group 1 -- ID(如P1和G1 )会影响性能吗?显然,我担心这种设计是可伸缩的。
ScoreView
+-----------+-----+-------+
| RID | EID | Score |
| 1 | P1 | 6 |
| 1 | P2 | 8 |
| 1 | P3 | 3 |
| 1 | P4 | 2 |
| 1 | P1 | 7 |
| 1 | P2 | 5 |
| 1 | P3 | 8 |
| 1 | P4 | 2 |
| 1 | G0 | 4.75 |*
| 1 | G1 | 4 |*
| 1 | G2 | … |*
| 1 | G3 | … |*
+-----------+-----+-------+发布于 2015-05-16 20:55:16
Apache是为解决这类问题而设计的开源工具。还可以看看。
https://stackoverflow.com/questions/30280275
复制相似问题