当您经常需要特定优先级顺序中的“最高优先级”值时,关系数据库的最佳模式是什么?

问题描述 投票:0回答:0

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

对所有三个公司都存在,因此这对的计数为 3.

的计数为 2.

任何其他对的计数为 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 的员工。

  1. 从 Employee 表中,搜索 company_id=CompanyC 的条目
  2. 对于所有条目,检查
    name
    是否等于'Ted'。如果是这样,我们就不需要更新
    Name_pair
    。如果没有,请继续下一步。
  3. e_name
    = 每个员工的姓名,其中 company_id=CompanyC。我们需要为每一对
    更新Name_pair
  4. 搜索
    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
  • 的条目
  • 如果条目存在,将 1 添加到
    occurence
    并为
    Name_pair_Company
    name_pair_id=[the entry's name_pair_id], company_id=CompanyC
  • 添加一个条目
  1. 按出现次数重新排序 Name_pair 表(或将其设计为链表,以便我只需将更新后的 Name_pair 条目重新附加到新位置。但我仍然需要支持排序)
sql database orm relational-database rdbms
© www.soinside.com 2019 - 2024. All rights reserved.