我应该如何命名将两个表映射在一起的表? [关闭]
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/…。该线程的其他一些想法:Shape2Color
、ShapeXColor
、ShapeColorLink
。
如果有一个命名连接表的标准 - 那么这将不是基于选项的。那么这就是问题的答案。通过关闭问题,您关闭了像我这样的人知道是否有命名连接表的标准方法的可能性。请重新考虑 - 关闭它的人......
我写了一篇关于命名连接表问题的博文:world.hey.com/jdmo/how-to-name-your-junction-tables-3735fdc9
【参考方案1】:
只有两件困难的事情 计算机科学:缓存失效 和命名-- Phil Karlton
为代表many-to-many
关系的表起一个好名字,使关系更易于阅读和理解。有时找到一个好名字并非易事,但通常值得花一些时间思考。
例如:Reader
和 Newspaper
。
Newspaper
有很多 Readers
,Reader
有很多 Newspapers
您可以将关系称为 NewspaperReader
,但像 Subscription
这样的名称可能会更好地传达表格的内容。
名称Subscription
也更惯用,以防您稍后想将表映射到对象。
命名many-to-many
表的约定是关系中涉及的两个表的名称的串联。 ColourShape
在您的情况下将是一个明智的默认值。也就是说,我认为 Nick D came up with 有两个很棒的建议:Style
和 Texture
。
【讨论】:
+1 :说得好 - 现在精心选择的名称将使将来的可维护性变得更加容易。 “计算机科学中只有两件困难的事情:缓存失效、命名事物和一个错误” 比如说,如果有一个产品类别和另一个食谱类别。对于这两个表,我们将有 recipe_categories 和 product_categories,因为我们不能只为这两个表“类别”表名,为了防止冲突,产品和配方的连接表将是“recipe_recipe_categories”和“product_product_categories” 严格来说,连接信息并不意味着添加新信息。我认为当您尝试为连接表找到合适的词时会发生这种情况。看报纸的人不会成为订阅者,没有没有颜色的形状。在将读者连接到报纸时,使用“订阅者”正在添加新信息(含义)。没有语言可以描述形状和颜色的联系——从来没有相反的东西,因此没有名字。请记住,联结表中没有提供新属性。 也不要使用大写字母。 reader_newspaper 更好。大写字母会在 postgres 等区分大小写的 rdms 中引起悲伤【参考方案2】:ColorShapeMap 或 Style 或 Texture 怎么样。
【讨论】:
+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 的评论,如果其他东西可以有颜色会怎样?如果我有另一个将文本映射到颜色的表,我需要一个唯一的名称。也许ShapeHasColor
和TextHasColor
?【参考方案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_Colour
和 Colour_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_colors
或r_shape_color
。在这种情况下,r_
将替代xref_
。
【讨论】:
【参考方案23】:我的投票是给最能描述表格的名称。在这种情况下,它可能是ShapeColor
,但在许多情况下,与串联不同的名称会更好。我喜欢可读性,对于 me,这意味着没有后缀、没有下划线和没有前缀。
【讨论】:
【参考方案24】:我个人会选择 Colour_Shape,带有下划线:只是因为我已经看到这种约定出现了很多。 [但同意这里的其他帖子,可能有更“诗意”的方式来做到这一点]。
请记住,外键也应该建立在这个连接表上,它会引用颜色和形状表,这也有助于识别关系。
【讨论】:
以上是关于我应该如何命名将两个表映射在一起的表? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章