我们正在开发一个应用程序,其中数百万的用户将同时输入信息。 假设该应用程序允许人们对他们想居住的地理位置进行评估。 允许每个参与者使用0-10之间的十进制值对每个区域评分。 每个人根据性别(例如,性别)以及认为自己活跃或喜欢文化的人都属于一个或多个组。
每次进行评分时,我们都需要有一个视图,向我们显示每个区域/组的平均评分。 我知道大多数数据库都有一个“平均”函数,但是出于我们的目的,我们需要能够使用我们自己的函数,因为我们可以使用几何平均值而不是算术平均值。
以下是一些可能使用的表格。 注意:为了简洁起见,我没有包括关系表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 |
+-----+-----+-------+
我们当前的实现使用一组相似的表来存储评分,但是我们无法实时计算平均值。 每当我们需要结果时(例如,向我显示加利福尼亚州女性的平均得分),我们都必须将所有信息拉入内存并手动运行计算。
我想知道如何利用数据库技术(例如视图,触发器,存储过程等)向我展示一个简单的表格,该表格可以让我按人员和组的评分,因此我们不必手动运行计算。
我想要类似以下的表格,其中所有内容都由数据库处理。 RegionScoresByPerson或Groups表上的任何插入,更新,删除操作都将自动反映在该表中。 如果不明显,则标记为*的行将计算出来。 在这种情况下,我使用的是简单的算术平均值,但我的设计应允许使用任何类型的函数。
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 | … |*
+-----------+-----+-------+