查找表是什么?

52

我刚给我们公司的数据库管理员展示了一个我创建的数据库图表,她在上面加了一些注释建议我重新命名某些表格,以便清楚地表示它们是查找表(在表格名字前添加“lu”)。

我的问题是这些表格并不符合我认为的查找表的定义。我一直认为查找表基本上是一组不定义任何关系的选项。例如:

luCarMake
-----------
id    Make
--    ---------
1     Audi
2     Chevy
3     Ford

我工作中的数据库专员建议我将几个表格重命名为查找表,这些表格仅将一个表格中的 ID 映射到另一个表格中。以下是一个示例(下面是 Location_QuadMap 表):

Location
----------
LocationId
name
description

Location_QuadMap <-- suggesting I rename this to luLocationQuad
----------------
QuadMapId
LocationId

luQuadMap
---------
QuadMapId
QuadMapName

我可以假设她误读了这个图表,还是有另外的定义我不知道的吗?

8个回答

55

您所拥有的是一张连接表,也被称为:

  • 交叉引用表
  • 桥接表
  • 联结表
  • 映射表
  • 交集表
  • 链接表
  • 关联表

但我从未见过“查找表”这个术语用于此目的。


9
我的前任经理经常把它们称为“查找表”。这就是我在看到给出的布局之前知道该表格的唯一原因。 - Justin Niessner
我也听说过这被称为“传递表”。 - siliconrockstar
是的...他给出的第一个例子是查找...实际上他有的是交集/连接。 - steviesama

25

把握重点,但我会要求对方澄清命名约定,因为他们建议在一对多和多对多关系中使用相同的约定。看起来任何外键关系都需要一个“查找”表。

如果这是其他数据库的命名约定,那么我不会冒险去推动更改。


2
说得好。有更重要的事情需要坚定立场。 - Toby Allen
3
完全同意你的“把握战机”的评论。 - Abe Miessler
2
尽管这种做法有一定的智慧,但是词语是有意义的,将“查找表”误用来描述连接表会令人困惑。毫无疑问,如果我坚持把所有的猫都称作“老鼠”,在现实世界中我会遇到沟通困难。我会努力进行得体的教育,然后再妥协。 不过,“入乡随俗”。 - ScottWelker

21

一个查找表通常是一个作为某些东西的“主列表”的表格,您可以使用它来查找商业键值(例如“Make”),以交换其标识符(例如id列)以用于其他表的外键列。

基本上,您需要输入要“查找”的内容,并将其交换为其他内容。

另一方面,location_quadmap是一个桥接表,正如其他人已经说过的那样,当您在两个实体之间具有多对多关系时使用。如果您称其为查找表,那么我会说任何表都可以称为查找表。这些表只包含到其他表的标识符,因此您首先必须在其中一个表中查找ID,在桥接表中查找匹配的ID,然后查找第三个表中匹配的行?似乎有点过度运用该术语。


谢谢Patrick,我一直在研究父子命名约定,而且我总是觉得主查找更容易使用(正如你提到的查找是主列表的确切原因)。这个旧术语“查找”让我想起了VB和Delphi时代,其中“查找”表是用于查找用户可以输入值的可视化组件的属性。你的描述完全符合,并且那些老开发人员可能会记得它是IDE的一部分的时代。 - Peter

9

查找表的一种用途是存储枚举值。

例如,我们有一个名为Status的枚举。

与其在数据库中每个记录中保存“未开始”,“进行中”,“已完成”,“退回”等文本,我们只保存整数1、2等。

在编程方面,像Entity Framework这样的ORM可以轻松将底层整数转换为枚举类型。

这种方式的缺点是从数据库方面无法读取整数值。为解决这个问题,我们添加了一个查找表,如下所示:

Id   Status
1    Not Started
2    In Progress
...

这样我们的数据库管理员就能够有一个“查找”的字典,通过与这个查找表联合显示状态文本。


3
OP的标题是“查找表是什么?”,而他们实际上提出的问题是另一个:“看起来像连接/映射表的这个东西也被一些人称为查找表吗?”。回答标题中所述的问题非常有帮助。 - Zach Valenta
好答案,来自@ZachValenta的正确评论。 - carloswm85

6

有些人使用查找表这个术语来指代位于多对多关系中间的表。


我通常听到将多对多表称为桥接表。而且,Abe对查找表的定义很有意思。 - bobs
好的,知道了。以前从未听说过。 - Abe Miessler
那将是“误用”该术语。 - ScottWelker

5
马克·拜尔斯对该表有正确的定义,基本上是一个交叉表。可以参考任何数据库教科书。但实际上,在我的工作中,我与许多DBAs /架构师合作,他们大多会发明自己的风格来做事情,并且不愿意听取其他任何意见。比如缩进规则,SQL语句的大小写,表命名约定(甚至是非常糟糕的命名),归档策略等。如果他们控制着数据库,你就没有选择了。你可以提及它是一个交叉表,指向适当的文献,但最终如果她想称之为MyStupidlyLongAndPointlessPrefixForTablesBecauseICan_Lookup_Location_Quadmap并坚持这样做,那么你无能为力。因此,尝试向她指出这一点,但如果她不接受,不要太认真...... 我突然想到了另外一件事。我们的“查找表”(定义)通常也称为“代码表”。因此,她可能会将交叉表称为查找表,将查找表称为代码表。在这种情况下,您可能需要学会说她的语言...

4

查找表是只包含某个主题/对象/事物的ID、名称和描述的表。ID是主键并且自增长。除此之外,没有其他内容。


0
我想迭代 @Blaise 给出的答案。
这主要涉及此问题的标题,而非实际的问题本身,但我仍然想指出我所知道的“查找表”。
在我工作的公司中,我们开发了一个具有大量“枚举”值的Web应用程序。想象一下,在几乎每个HTML表单中,至少有一个下拉菜单可供选择超过10个选项。在其他表单中,可能会有数十个复选框,您可以选中或取消选中以启用或禁用系统的某些方面。
从历史上看,我已经将这种类型的数据硬编码到我的程序中,因为我认为它不是“实时”数据,因此不值得保存在关系型数据库中。但是,我的一位同事建议这样做,我很快就采纳了这个建议。
这是这样一个查找表(包括数据)的示例:
feature
-------
id int (PK): 1, 2, ...
key varchar: "fulltextSearch", "apiDebugger"
name: "Use fulltext search", "Enable API debugging console"

像这样的表可能有数十行,代表系统设置、功能标志等。

当开发一个考虑到多租户的系统时,这变得有趣和有用。在这样的系统中,可以通过n-m关系表来管理每个租户的设置/功能:

tenant
______
id int (PK): 1, 2, ...
name varchar: "Your Company", "My Company"

tenant_feature
______________
tenant_id int (foreign key to tenant.id)
feature_id int (foreign key to feature.id)
feature_config varchar: {...}, {...}

tenant_feature现在不仅作为将租户与功能链接的表,还包含有关给定功能的配置元数据等附加信息。


我在许多应用程序中都没有使用过这种模式,但在我的当前项目中,这使我可以做一些事情:

  • 如果业务需要禁用或逐步推出新功能/设置/等仅适用于某些系统,则可以简单地向查找表添加一个active列,并使用该列而不是构建单独的应用程序,一个启用了功能,一个禁用了它
  • 如果枚举值经常添加、更改和删除,这使我能够快速构建一个围绕此表的API,以使关键用户为我执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接