计算m:n关系中元组出现次数

时间:2014-04-18 15:03:25

标签: sql

我想知道是否有一种有效的方法来计算m:n关系一侧的实体排列的出现次数。希望下一个例子能够恰当地说明我的意思:

让我们想象一下人与某种事件的基础。人们可以组织多个活动,活动可以由多人组织。我想要计算的是某个元组是否已经组织了一次活动,或者这是否是他们的第一次。我的第一个想法是在m:n关系中添加一个属性

PeopleID | EventID | TimesOrganized
100        1         1
200        1         1
300        2         1
400        3         1

现在,有一个事件没有。 4再次由人200和100组织(假设他们应该按顺序添加)。新表应如下所示:

PeopleID | EventID | TimesOrganized
100        1         2
200        1         2
300        2         1
400        3         1
200        4         2
100        4         2

现在,如果我添加了由200和300人组织的活动,它将如下所示:

PeopleID | EventID | TimesOrganized
100        1         2
200        1         2
300        2         1
400        3         1
200        4         2
100        4         2
200        5         1
300        5         1

如何正确更新第三列以及我的选择是什么?


我还应该补充一点,这是我们为其中一个类开发的一个大项目的一部分,我们将实现一个以某种方式使用数据库的应用程序,所以我不妨将它移到应用程序逻辑中没有简单的方法。

2 个答案:

答案 0 :(得分:0)

我不建议您按照建议跟踪TimesOrganized列。

您可以根据需要使用COUNT(EventId).. GROUP BY PeopleID进行简单查询。

如果你觉得你需要在某个地方保持这个值,那么它可能更好地归一化为(假定的)表人。像People.TimesOdeganized这样的东西。但是你必须在你去的时候增加它,而不是仅仅根据需要重新计算。

答案 1 :(得分:0)

如果你想计算一个人组织一个事件的次数,问题不是m:n,而是1:m。只计算由人员分组的事件,就是这样,如果不需要很多时间,你根本不需要在表格中包含该列。

那说我发现你的表有点混乱,有细节和聚合混合,第三个是彻头彻尾的错误:PeopleID 200组织了3个事件,300个有2个事件。

相关问题