我应该给将两个表映射在一起的表起什么名字?

179

假设我有两个表:

Table: Color
Columns: Id, ColorName, ColorCode

Table: Shape
Columns: Id, ShapeName, VertexList

我应该如何称呼将颜色映射到形状的表格?

Table: ???
Columns: ColorId, ShapeId

ColorShape 和 ShapeColor 是对称性的别名。 - LukLed
4
我刚刚发现了一个之前没有看到过的类似问题:https://dev59.com/IXI-5IYBdhLWcg3wm5zN。那个帖子中还有一些其他的想法,如“Shape2Color”、“ShapeXColor”和“ShapeColorLink”。 - devuxer
3
如果有一种命名连接表的标准,那么这个问题就不会是基于个人观点的了。这将成为回答这个问题的方法。关闭这个问题将阻止像我这样的人了解是否存在标准的命名连接表的方式。请重新考虑一下 - 关闭它的人... - Lealo
2
我写了一篇关于如何命名连接表的博客文章:https://world.hey.com/jdmo/how-to-name-your-junction-tables-3735fdc9 - mollerhoj
24个回答

234

计算机科学中只有两件难事:缓存失效和命名事物
-- Phil Karlton

为代表多对多关系的表起一个好名字可以使关系更易于阅读和理解。有时候找到一个好名字并不容易,但通常值得花费一些时间来思考。

例如:ReaderNewspaper

Newspaper 有很多 Readers,而一个 Reader 也有很多 Newspapers

你可以称这个关系为 NewspaperReader,但像 Subscription 这样的名称可能更能传达出表的意义。

如果以后要将表映射到对象,则名称 Subscription 更符合惯用语法。

命名 many-to-many 表的惯例是连接涉及到该关系的两个表的名称。在你的情况下,ColourShape 是一个明智的默认选择。话虽如此,我认为 Nick D 提出 了两个很棒的建议: StyleTexture


12
+1:说得好。现在精心选择一个名称将使未来的可维护性更容易。 - Preet Sangha
174
计算机科学中只有两个难点:缓存失效、命名事物和 off-by-one 错误。 - Neil McGuigan
3
假设有一个产品类别和另一个食谱类别。对于这两个表,我们将拥有recipe_categories和product_categories,并且由于我们不能仅使用“categories”表名来表示这两个表,为了避免冲突,产品和食谱的连接表将分别是“recipe_recipe_categories”和“product_product_categories”。 - c9s
11
严格来说,连接信息并不意味着添加新信息。我认为这就是在寻找适合连接表的单词时所发生的事情。读报纸的人并不会成为订户,没有颜色的形状也不存在。使用“订户”将读者与报纸连接起来时,会添加新的信息(含义)。而形状和颜色之间的联系没有词语可以描述——从未有过相反的情况,因此也没有名称。请记住,在连接表中不会给出新属性。 - Lealo
读者_报纸更好。大写字母会在大小写敏感的关系型数据库(如PostgreSQL)中引起麻烦。 - ChatGPT

47

那么如何选择 ColorShapeMapStyleTexture 呢?


7
将英语翻译为中文。仅返回翻译后的文本:对于想出比仅仅连接表名更优雅的内容,加一分。 - tosh

28

给表格起一个你喜欢的、信息充分的名字:

COLOR_SHAPE_XREF

从数据模型的角度来看,这个表叫做关联/交叉引用表。我习惯在表名结尾添加_XREF以便于识别关系。


2
我也使用_XREF... 这对我来说总是很有意义。 - James Cronen
1
我很喜欢这个想法,但作为AutoCAD用户,我需要找到一个不同于“_XREF”的后缀。 - Mike
XREF 意味着外部参照,对吧?非常好的想法。 - ikhvjs
1
@ikhvjs 在这个上下文中,XREF 意味着“交叉引用”。 - Clayton

27

有趣的是,大约一半的答案给出了一个通用术语,用于实现多对多关系的任何表,另一半的答案则建议为此特定表提供名称。

我通常将这些表称为交集表

在命名惯例方面,大多数人都给出了一个由多对多关系中的两个表组成的合成名称。因此,在这种情况下,可以选择"ColorShape "或 "ShapeColor"。但我觉得这看起来很不自然,很尴尬。

Joe Celko在他的书"SQL编程风格"中建议以某种自然语言方式命名这些表。例如,如果形状是通过颜色上色的,则将表命名为ColoredBy。然后,您可以拥有一张图表,其读起来更加自然,类似于这样:

Shape <-- ColoredBy --> Color

相反地,你可以说一个 Color 给一个 Shape 上色:

Color <-- Colors --> Shape

但这看起来中间的表格与使用复数命名规则的Color是同一物品。太令人困惑了。

可能最清晰的方式是使用ColoredBy的命名规则。有趣的是,使用被动语态让命名规则更加清晰。


@Bill:所有关于同义词的事情,以及同义词的偏好会影响命名规则。 - OMG Ponies
2
我想“HasColor”可能是使用自然语言的交集表的另一个可能名称。 - Bill Karwin
1
@Bill:我对这种命名约定的问题是,hasColour/ColouredBy 是用来做什么的?使用 DESCRIBE 来查找关系违背了命名的目的。 - OMG Ponies
5
与OMG Ponies的评论类似,如果其他东西也有颜色,会发生什么?如果我有另一个将文本映射到颜色的表格,我需要一个唯一的名称。也许是ShapeHasColorTextHasColor - devuxer
是的,这些是很好的评论。我认为在使用自然语言作为命名约定的指导方针下,这些问题是可以解决的。 - Bill Karwin

9

连接表

或者 桥接表

或者 关联表

或者 映射表

或者 链接表

或者 交叉引用表

当我们需要处理多对多的关系时,就会使用连接表。连接表的复合主键由两个表的键组成。


8
映射表通常称为“mapping table”。
ColorToShape
ColorToShapeMap

1
实际上,“映射”一词通常用于关系是单向的情况(一对一或多对一)。这是这种情况吗?如果是这样,那么通常不需要另一个表。如果颜色总是确定形状,则将形状列添加到颜色表中,反之亦然。只有在关系为多对多时才通常需要额外的表。在这种情况下,“映射”一词并不合适。 - Charles Bretana
1
在这种情况下,任何形状都可以匹配任何颜色,因此是多对多的。 - devuxer
4
顺便提一下,无论是不是映射表,我都很喜欢在名称中使用“To”的想法。如果你有一个带有HighlightColor的Shape,如果称其为“ShapeHighlightColor”,则可能含义有些模糊,即ShapeHighlight映射到了一种颜色,还是Shape映射到了Highlight颜色。因此,“ShapeToHighlightColor”可能更加清晰明了。 - devuxer
2
FYI:Oracle(9i/10g)对表名有32个字符的限制,因此您不能使用过于冗长的名称。 - OMG Ponies
1
我使用了上面的答案,但稍微不同一点,即Color_Shape_Map。约定:Table1_Table2_Map。 - Goldfish

8

这是一个关联实体,通常本身就具有重要意义。

例如,列车和时间之间的多对多关系会产生时刻表。

如果没有明显的新实体(如时刻表),则惯例是将两个单词连在一起,例如COLOUR_SHAPE或类似名称。


7
我建议使用实体的名称组合,并将它们变成复数形式。这样,表的名称就能表示连接“多对多”。
在你的情况下:
颜色 + 形状 = ColorsShapes

2
如果你选择使用“表名”这种方式,这会更好,因为单数版本通常会成为一个命名空间表。 - Andrew Haust

7

我曾经与一些称其为“连接表”的数据库管理员合作。

除非关系具有显式的领域特定名称,否则Colour_Shape是相当典型的。


4
我不喜欢下划线,因为它们与外键命名约定冲突,导致出现像 Colour_Shape_ColourColour_Shape_Shape 这样的糟糕命名。 - Dan Bechard

5

我通常听到这被称为连接表。我根据它连接的内容来命名表格,所以在你的情况下可以使用ColorShape或ShapeColor。我认为形状拥有颜色比颜色拥有形状更有意义,所以我会选择ShapeColor


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