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

Posted

技术标签:

【中文标题】我应该如何命名将两个表映射在一起的表? [关闭]【英文标题】:What should I name a table that maps two tables together? [closed] 【发布时间】:2010-12-21 06:19:05 【问题描述】:

假设我有两张桌子:

Table: Color
Columns: Id, ColorName, ColorCode

Table: Shape
Columns: Id, ShapeName, VertexList

将颜色映射到形状的表格应该叫什么?

Table: ???
Columns: ColorId, ShapeId

【问题讨论】:

ColorShape 和 ShapeColor 对称的别名。 我刚刚遇到了一个我以前没见过的类似问题:***.com/questions/1764483/…。该线程的其他一些想法:Shape2ColorShapeXColorShapeColorLink 如果有一个命名连接表的标准 - 那么这将不是基于选项的。那么这就是问题的答案。通过关闭问题,您关闭了像我这样的人知道是否有命名连接表的标准方法的可能性。请重新考虑 - 关闭它的人...... 我写了一篇关于命名连接表问题的博文:world.hey.com/jdmo/how-to-name-your-junction-tables-3735fdc9 【参考方案1】:

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

为代表many-to-many 关系的表起一个好名字,使关系更易于阅读和理解。有时找到一个好名字并非易事,但通常值得花一些时间思考。

例如:ReaderNewspaper

Newspaper 有很多 ReadersReader 有很多 Newspapers

您可以将关系称为 NewspaperReader,但像 Subscription 这样的名称可能会更好地传达表格的内容。

名称Subscription 也更惯用,以防您稍后想将表映射到对象。

命名many-to-many 表的约定是关系中涉及的两个表的名称的串联。 ColourShape 在您的情况下将是一个明智的默认值。也就是说,我认为 Nick D came up with 有两个很棒的建议:StyleTexture

【讨论】:

+1 :说得好 - 现在精心选择的名称将使将来的可维护性变得更加容易。 “计算机科学中只有两件困难的事情:缓存失效、命名事物和一个错误” 比如说,如果有一个产品类别和另一个食谱类别。对于这两个表,我们将有 recipe_categories 和 product_categories,因为我们不能只为这两个表“类别”表名,为了防止冲突,产品和配方的连接表将是“recipe_recipe_categories”和“product_product_categories” 严格来说,连接信息并不意味着添加新信息。我认为当您尝试为连接表找到合适的词时会发生这种情况。看报纸的人不会成为订阅者,没有没有颜色的形状。在将读者连接到报纸时,使用“订阅者”正在添加新信息(含义)。没有语言可以描述形状和颜色的联系——从来没有相反的东西,因此没有名字。请记住,联结表中没有提供新属性。 也不要使用大写字母。 reader_newspaper 更好。大写字母会在 postgres 等区分大小写的 rdms 中引起悲伤【参考方案2】:

ColorShapeMapStyleTexture 怎么样。

【讨论】:

+1 提出了比仅仅加入表格名称更优雅的东西【参考方案3】:

只要能提供信息,就可以随意命名表格:

COLOR_SHAPE_XREF

从模型的角度来看,该表称为连接/推论/交叉引用表。我一直保持在最后使用_XREF 的习惯,以使关系明显。

【讨论】:

我也使用 _XREF...这对我来说总是有意义的。 我理解这个想法,但作为 AutoCAD 用户,我需要找到与 _XREF 不同的后缀... XREF 表示外部参考,对吗?好主意。【参考方案4】:

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

我一般称这些表为交叉点表

在命名约定方面,大多数人给出的名称是多对多关系中两个表的组合。所以在这种情况下,“ColorShape”或“ShapeColor”。但我觉得这看起来很做作而且很尴尬。

Joe Celko 在他的《SQL 编程风格》一书中建议以某种自然语言方式命名这些表。例如,如果 Shape 由 Color 着色,则将表命名为 ColoredBy。然后你可以有一个或多或少自然地读起来像这样的图表:

Shape <-- ColoredBy --> Color

相反,您可以说颜色为形状着色:

Color <-- Colors --> Shape

但这看起来中间的表格与Color 相同,但命名约定为复数。太混乱了。

使用ColoredBy 命名约定可能最清楚。有趣的是,使用被动语态使命名约定更加清晰。

【讨论】:

比尔,谢谢。非常有趣的答案。 @Bill:关于同义词,同义词偏好会影响命名约定。 我想HasColor 可能是使用自然语言的交集表的另一个可能名称。 @Bill:我对命名约定的问题是hasColour/ColouredBy 是为了什么?必须使用DESCRIBE 来找出关系,这违背了命名的目的。 类似于 OMG Ponies 的评论,如果其他东西可以有颜色会怎样?如果我有另一个将文本映射到颜色的表,我需要一个唯一的名称。也许ShapeHasColorTextHasColor【参考方案5】:

这是一个Associative Entity,它本身就很重要。

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

如果没有明显的新实体(例如时间表),则惯例是将这两个词一起运行,给出 COLOUR_SHAPE 或类似的词。

【讨论】:

【参考方案6】:

映射表就是通常所说的。

ColorToShape
ColorToShapeMap

【讨论】:

其实,Mapping这个词一般用在关系是单向的(一对一或多)的时候,是不是这种情况?如果是这样,那么通常您不需要另一张桌子。如果颜色总是决定形状,则在颜色表中添加一个形状列,反之亦然。通常仅当关系是多对多时才需要附加表。在这种情况下,术语映射不合适。 在这种情况下,任何形状都可以匹配任何颜色,所以它是多对多的。 顺便说一句,不管是不是映射表,我有点喜欢在名称中使用To 的想法。如果你有带 HighlightColor 的形状怎么办。如果你称它为ShapeHighlightColor,它是映射到颜色的ShapeHighlight 还是映射到Highlight Color 的Shape 有点模棱两可。所以,ShapeToHighlightColor 可能会更清楚。 仅供参考:Oracle(无论如何都是 9i/10g)对表名有 32 个字符的限制,所以你不能罗嗦。 我使用了上面的答案,但方式有点不同。即 Color_Shape_Map。约定:Table1_Table2_Map【参考方案7】:

我曾与将其称为连接表的 DBA 合作过。

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

【讨论】:

我不喜欢下划线,因为它们与外键命名约定冲突,因此您最终会得到像 Colour_Shape_ColourColour_Shape_Shape 这样讨厌的名称。【参考方案8】:

Junction table

Bridge Table

Join Table

Map Table

Link Table

Cross-Reference Table

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

【讨论】:

【参考方案9】:

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

在你的情况下:

颜色 + 形状 = 颜色形状

【讨论】:

如果你要走“表名”路线,这会更好,因为单数版本“通常”是一个命名空间表。【参考方案10】:

我通常听到称为 Junction Table。我通过它的连接来命名表,所以在你的情况下,要么是 ColorShape,要么是 ShapeColor。我认为 Shape 有颜色比 Color 有形状更有意义,所以我会选择 ShapeColor

【讨论】:

【参考方案11】:

中间表加入表

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

【讨论】:

【参考方案12】:

我也听说过使用术语关联表。

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

【讨论】:

但是你会给实际的表起什么名字呢? 这取决于表格描述的内容。如果它说“任何橙色都必须是菱形”、“任何紫色都必须是圆形”等,那么您可以将其称为一件事(也许是 Colour_of_Shape)。如果它是更宽松的定义 - 形状的已知颜色,允许单个形状多次出现 - 那么可能是“Shape_Colour_Map”。【参考方案13】:

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

主键:tablename_columnname_pkey 唯一约束:tablename_columnname_key 排他性约束:tablename_columnname_excl 其他用途的索引:tablename_columnname_idx 外键:tablename_columnname_fkey 序列:tablename_columnname_seq 触发器:tablename_actionname_after|before_触发

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

链接表:tablename1_tablename2_lnk

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

或喜欢的表:目的名_lnk

【讨论】:

好老的匈牙利符号,我们又见面了。【参考方案14】:

我经常看到一个我个人喜欢的连接表格的约定是“Colour_v_Shape”,我听说人们通俗地称之为“对表格”。

它一目了然地表明该表表示多对多关系,并且有助于避免当您尝试连接两个可能形成复合词的单词时(尽管很少见)令人困惑的情况,例如'Butter' 和 'Milk' 可能会变成 'ButterMilk',但如果你还需要表示一个名为 'Buttermilk' 的实体呢?

这样做,你会得到'Butter_v_Milk'和'Buttermilk' - 没有混淆。

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

哦,我会根据哪个是更常用的表格来调用表格 ShapeColor 或 ColorShape。

【讨论】:

【参考方案17】:

很难回答这样随意的问题,但我更喜欢 tosh 的想法,即在实际域中的某些东西之后命名它,而不是对底层关系的一些通用描述。

这种类型的表通常会演变成更丰富的领域模型,并且会在链接外键之外具有额外的属性。

例如,如果除了颜色之外还需要存储纹理怎么办?扩展 SHAPE_COLOR 表以保存其纹理可能看起来有点古怪。

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

综上所述,如果我知道稍后会引入其他类似表面的属性,我会称之为 SURFACE。如果不是,我将其命名为 SHAPE_COLOR 或类似名称并继续解决更紧迫的设计问题。

【讨论】:

【参考方案18】:

也许只是ColoredShape

我不确定我是否明白这个问题。这是关于这个特定案例还是您在寻找一般指南?

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

根据 Developer Art 的相关内容,

ColorShape

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

【讨论】:

【参考方案21】:

称之为交叉引用表。

XREF_COLOR_SHAPE
(
     XCS_ID INTEGER
     C_ID   INTEGER
     S_ID   INTEGER
)

【讨论】:

【参考方案22】:

我会根据其含义使用r_shape_colorsr_shape_color。在这种情况下,r_ 将替代xref_

【讨论】:

【参考方案23】:

我的投票是给最能描述表格的名称。在这种情况下,它可能是ShapeColor,但在许多情况下,与串联不同的名称会更好。我喜欢可读性,对于 me,这意味着没有后缀、没有下划线和没有前缀。

【讨论】:

【参考方案24】:

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

请记住,外键也应该建立在这个连接表上,它会引用颜色和形状表,这也有助于识别关系。

【讨论】:

以上是关于我应该如何命名将两个表映射在一起的表? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 一个类映射到多个表

如何将 Btree 或哈希索引添加到 mysql 中的表中? [关闭]

重命名 TableRow 属性名称

在 Hibernate 中映射 2 个具有相同结构的表

Oracle:将两个具有不同列的表组合在一起

两个进程之间的命名共享内存