我应如何命名将两个表映射在一起的表?[关闭]


137

假设我有两个表:

Table: Color
Columns: Id, ColorName, ColorCode

Table: Shape
Columns: Id, ShapeName, VertexList

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

Table: ???
Columns: ColorId, ShapeId

对称性的ColorShape和ShapeColor别名。
LukLed

2
我刚刚遇到一个类似的问题,之前从未见过:stackoverflow.com/questions/1764483/…。从该线程的一些其他的想法:Shape2ColorShapeXColorShapeColorLink
devuxer

如果有一个命名连接表的标准-那么这将不是基于opnion的。那将是对这个问题的答案。通过关闭问题,您可以关闭像我这样的人知道是否存在命名联结表的标准方法。请重新考虑-关闭它的人...
Lealo

Answers:


187

只有两个在计算机科学坚硬的东西:缓存失效和命名的事情
- 菲尔Karlton

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

例如:ReaderNewspaper

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

您可以调用该关系,NewspaperReader但是像这样的名称Subscription可能会更好地传达表的含义。

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

many-to-many表的命名约定是关系中涉及的两个表的名称的串联。ColourShape在您的情况下将是明智的默认选择。也就是说,我认为Nick D 提出了两个不错的建议:StyleTexture


10
+1:好说-现在精心选择的名称将使将来的可维护性变得更加容易。
Preet Sangha

115
“计算机科学中只有两件难事:缓存失效,命名和一次错误”
Neil McGuigan 2013年

1
假设有一个产品类别和一个食谱类别。对于这两个表,我们都将具有recipe_categories和product_categories,并且由于我们不能仅对两个表都使用“ categories”表名,为了防止冲突,产品和配方的联结表将分别为“ recipe_recipe_categories”和“ product_product_categories”
c9s

3
从逻辑上讲严格来说,连接信息并不意味着添加新信息。我认为当您尝试为联结表找到合适的词时会发生这种情况。看报纸的人不会使他们成为订户,并且没有没有颜色的形状。将读者连接到报纸时,使用“订户”会添加新的信息(含义)。而且没有语言来描述形状和颜色的联系-从来没有相反的东西,因此没有名字。请记住,联结表中没有提供任何新属性。
Lealo


22

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

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

在命名约定方面,大多数人给出的名称是多对多关系中两个表的混合物。因此,在这种情况下为“ ColorShape”或“” ShapeColor。但是我发现这看起来是人为的和尴尬的。

Joe Celko在他的书“ SQL Programming Style”中建议以某种自然语言方式命名这些表。例如,如果Shape由Color着色,则将table命名ColoredBy。然后,您可能会得到一个或多或少自然地读取的图表,如下所示:

Shape <-- ColoredBy --> Color

相反,您可以说Color为Shape着色:

Color <-- Colors --> Shape

但这看起来中间表Color与复数命名约定是同一回事。太混乱了。

也许最清楚地使用ColoredBy命名约定。有趣的是,使用被动语音使命名约定更加清晰。


比尔,谢谢。非常有趣的答案。
devuxer

@Bill:关于同义词的所有信息,同义词首选项会影响命名约定。
OMG小马

2
我想这HasColor可能是使用自然语言的交叉表的另一个可能名称。
比尔·卡温

1
@Bill:我的命名约定存在的问题是hasColour/ 是ColouredBy为了什么?它打败了命名的目的,即不得不使用它DESCRIBE来查找关系。
OMG小马

5
与OMG Ponies的评论类似,如果其他事物可以具有颜色会发生什么呢?如果我还有另一个将Text映射为Color的表,则需要一个唯一的名称。也许ShapeHasColorTextHasColor
devuxer

20

只要您喜欢该表,只要它能提供参考即可:

COLOR_SHAPE_XREF

从模型角度来看,该表称为联接/对等/交叉引用表。我一直养成_XREF在结束时使关系变得明显的习惯。


1
我也使用_XREF ...这对我来说总是很有意义的。
James Cronen 09年

我想出了这个主意,但是作为AutoCAD用户,我需要找到一个不同于_XREF的后缀...
Mike

7

这是一 关联实体,其本身通常很重要。

例如,TRAINS和TIMES之间的多对多关系产生了TIMETABLE。

如果没有明显的新实体(例如时间表),则约定是将两个单词放在一起,并给出COLOUR_SHAPE或类似名称。


6

映射表通常称为映射表。

ColorToShape
ColorToShapeMap

实际上,当关系是单向的(一对一或多个)时,通常使用术语“映射”。这是偶然的吗?如果是这样,那么通常您不需要另一个表。如果颜色始终决定形状,则将形状列添加到颜色表中,反之亦然。通常仅在关系是多对多时才需要一个附加表。在那种情况下,术语映射是不合适的。
Charles Bretana 09年

在这种情况下,任何形状都可以匹配任何颜色,因此它是多对多的。
devuxer

2
顺便说一句,无论它是否是映射表,我都喜欢To在名称中使用的想法。如果您的Shape具有HighlightColor怎么办。如果调用它ShapeHighlightColor,则是将ShapeHighlight映射到颜色还是将Shape映射到突出显示颜色,这有点模棱两可。因此,ShapeToHighlightColor可能会更清楚。
devuxer

仅供参考:Oracle(无论如何是9i / 10g)表名的字符数限制为32个字符,因此您不会罗y。
OMG小马

我使用了上面的答案,但方式有所不同。即Color_Shape_Map。惯例:Table1_Table2_Map
金鱼

6

我曾与DBA合作,称其为联接表

Colour_Shape是相当典型的-除非该关系具有明确的域特定名称。


1
我不喜欢使用下划线,因为它们与外键命名约定冲突,因此您最终会使用诸如Colour_Shape_Colour和讨厌的名称Colour_Shape_Shape
Dan Bechard

4

我通常会听到一个称为“连接表”的信息。我通过连接的表来命名表,因此在您的情况下为ColorShape或ShapeColor。我认为,使形状具有颜色比使颜色具有形状更有意义,所以我同意ShapeColor


4

Junction table

要么 Bridge Table

要么 Join Table

要么 Map Table

要么 Link Table

要么 Cross-Reference Table

当我们使用多对多关系时,这是有用的,其中两个表中的键构成联结表的复合主键。


4

我建议使用实体名称的组合,并将它们放在复数形式。因此,该表的名称将表示“多对多”连接。

在您的情况下:

颜色+形状=颜色形状


如果您要使用“表名”路由,这样做会更好,因为单数版本“通常”是命名空间表。
安德鲁·哈斯特

3

中间表联接表

我会根据您的喜好将其命名为“ ColorShapes”或“ ColorShape”


3

我也听说过术语“ 关联表”。

表格的名称可能ColorShapeAssociations意味着每一行都代表该颜色与该形状之间的关联。行的存在意味着颜色以该形状出现,并且该形状以该颜色出现。具有特定颜色的所有行将是与该颜色关联的所有形状的集合,而特定形状的行将是该形状进入的所有颜色的集合...


但是,您将如何命名实际表?
devuxer

这取决于表所描述的内容。如果说“橙色必须是菱形”,“紫色必须是圆圈”等,那么您可以将其称为一件事(也许是Colour_of_Shape)。如果定义较为宽松-已知形状的颜色,则允许一个形状出现多次-则可能是“ Shape_Colour_Map”。
乔纳森·莱夫勒

2

通常,大多数数据库对索引,主键等都有某种命名约定。在PostgreSQL中,建议使用以下命名:

  • 主键:tablename_columnname_ pkey
  • 唯一约束:tablename_columnname_
  • 排他约束:tablename_columnname_ excl
  • 用于其他目的的索引:tablename_columnname_ idx
  • 外键:tablename_columnname_ fkey
  • 顺序:tablename_columnname_ seq
  • 触发器:tablename_actionname_after | before_ trig

您的表是我的链接表。为了与上面的命名保持一致,我将选择以下内容:

  • 链接表:tablename1_tablename2_ lnk

在表对象列表中,链接的表将在tablename1之后。在视觉上这可能更有吸引力。但是您也可以像其他人建议的那样选择描述链接目的的名称。这可能有助于使id列的名称简短(如果您的链接必须具有其自己的命名id并在其他表中引用)。

  • 或喜欢的表:purposename_ lnk

1
好的匈牙利符号,我们再见面。
Dan Bechard

1

我一直偏爱“汉堡包桌”一词。不知道为什么-听起来不错。

哦,我会根据更常用的表来称呼表ShapeColor或ColorShape。


1

“多对多”表。我将其称为“ ColourShape”,反之亦然。


1

很难回答如此随意的问题,但是我倾向于使用Tosh的想法,即以实际领域中的某事命名,而不是对基础关系进行一般描述。

这种表经常会演变为领域模型更丰富的表,并且将具有链接的外键之上和之外的其他属性。

例如,如果您除了颜色之外还需要存储纹理,该怎么办?扩展SHAPE_COLOR表以保留其纹理似乎有点时髦。

另一方面,要根据您今天的需求做出明智的决定,并准备在以后引入其他需求时进行重构,还有很多话要说。

话虽如此,如果我了解到以后会引入其他类似表面的特性,我将其称为SURFACE。如果没有,我将它命名为SHAPE_COLOR或类似的东西就没有问题,然后继续处理更紧迫的设计问题。


1

也许只是ColoredShape

我不确定我是否知道这个问题。这是关于此特定情况的,还是您正在寻找一般准则?


0

我用要连接的表的确切名称来命名它= ColorShape。


0

忠于Developer Art的相关内容,

ColorShape

将是通常的命名约定。在ER图中,这是一个关系。


0

将其称为交叉引用表。

XREF_COLOR_SHAPE
(
     XCS_ID INTEGER
     C_ID   INTEGER
     S_ID   INTEGER
)


0

我的投票是最能描述这张桌子的名字。在这种情况下,可能是这样,ShapeColor但是在许多情况下,与串联不同的名称会更好。我喜欢可读性,对我来说,这意味着没有后缀,没有下划线和前缀。


0

我个人会带下划线选择Colour_Shape:只是因为我已经看到这种约定出现了很多。[但是要与这里的其他帖子保持一致,这样做可能有更多的“诗意的”方式]。

请记住,外键也应该建立在该联接表上,该联接表将同时引用“颜色和形状”表,这也将有助于识别关系。


0

我个人喜欢的连接表的约定很多,就是“ Colour_v_Shape”,我听说有人俗称其为“对比表”。

一目了然,该表代表了多对多关系,当您尝试将两个可能会组成复合词的词(例如“黄油”)串联时,有助于避免这种(尽管很少见)令人困惑的情况并且“牛奶”可能会变成“黄油牛奶”,但是如果您还需要代表一个名为“黄油牛奶”的实体怎么办?

这样,您将拥有“ Butter_v_Milk”和“ Buttermilk”-不会造成混淆。

另外,我想认为原始问题中有Foo Fighters参考。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.