TLDR:如果我经常想要一行值计数的前 5 列表,有没有办法创建一个表来维护顺序,以便数据库可以简单地返回前 5 个条目而不需要计算前 5 个?如果不是,什么是好的选择?
这个问题与语言无关,但对于上下文,我目前正在使用 Java Spring + H2。
-- 背景说明--
假设我有以下实体
One Company to many Employee. Many Employee to One Company.
Company
------------
company_id (primary key)
Employee
----------
employee_id (primary key)
name (string)
company_id (foreign key to Company)
虽然每个员工都可以通过 id 唯一标识,但他们的名字并不是唯一的。
我想要前 5 个最常见的名字对
例如,让我们想象一下以下公司和员工(尽管员工同名,但他们是不同的人)
Company A: Ann, Bob, Charlie
Company B: Ann, Bob, Dan
Company C: Ann, Bob, Dan
任何其他对的计数为 1 或 0。
所以前5名是
1. <Ann, Bob>: CompanyA, CompanyB, CompanyC
2. <Bob, Dan>: CompanyB, CompanyC
3. <Ann, Dan>: CompanyB, CompanyC
...
这里有一个额外的考虑。读的会比写的多得多。
也就是说,求这个top 5的人会很多,那个排名很少更新
因此,我不想让数据库搜索并找出每个请求的对,而是希望已经准备好数据。
我想要一个维护排名的表,每次添加或删除员工条目时,我都会更新该排名表。
所以我可能想要像这样的额外表格
Many Name_pair to many Company.
Name_pair
------------
name_pair_id (primary key)
name1 (string) (set as an index)
name2 (string) (set as an index)
occurence (int)
Name_pair_Company
------------
name_pair_id (fk)
company_id (fk)
因为我们每次只想要前 5 个,如果我能设计这个表,让它按出现顺序排序,我会很高兴,这样我就可以简单地获取前五个条目,而不是数据库需要弄清楚哪个是最上面的5.但是据我所知,SQL是无序的。那么,有办法解决吗?
-- 关于添加员工时我将如何更新 Name_pair 的奖金上下文(如果我也能对此发表评论,将不胜感激)--
假设在 CompanyC 中添加了一个名为 Ted 的员工。
name
是否等于'Ted'。如果是这样,我们就不需要更新Name_pair
。如果没有,请继续下一步。e_name
= 每个员工的姓名,其中 company_id=CompanyC。我们需要为每一对更新Name_pair
Name_pair
where name1=e_name and name2=Ted
或where name1=Ted and name2=e_name
中的所有条目。name1=e_name, name2=Ted, occurence=1
的条目并为Name_pair_Company
添加一个name_pair_id=[the newly created name_pair_id], company_id=CompanyC
occurence
并为 Name_pair_Company
的 name_pair_id=[the entry's name_pair_id], company_id=CompanyC