在RDBMS术语中,“has_one”vs“belongs_to”vs“has_many”

时间:2011-03-13 06:54:46

标签: orm terminology rdbms

有人可以澄清RDBMS中的含义。我总是把这些搞糊涂了,我找不到一个体面的教程。尝试将定义减少到,

  • 链接表
  • 主键
  • 外键

或者,告诉我为什么这些定义不能简化为这样的简单。不要使用ORM术语定义它们。

2 个答案:

答案 0 :(得分:3)

编辑:ORM通常是数据库上非常薄的贴面。通常,类被映射到表,这些类的实例作为表中的行。名为'USERS'且名为USERNAME的varchar字段的表可能会映射到名为User的类,其字符串属性为username

当映射数据库中的两个表与外键约束相关时,事情会变得更有趣。 'USERS'表可能有一个名为'ID'的主键,而第二个表(例如'ADDRESSES')可能包含一个名为'USER_ID'的字段,该字段约束为'USERS'.'ID' 。在这种情况下,用户是独立的,并且地址是依赖的。 users表中的一行可以取任何值,但地址表中的行必须在users表中有相应的行,否则不满足外键约束

当它映射到应用程序类时,主键通常被遮挡。这不是应用程序感兴趣的ID。我们在上面的示例中真正想要的是,映射的Address类具有类型为User的属性,即该地址的对应映射用户。同样,我们可能希望User类具有属于Addresses的集合的属性,这些属性依赖于它。

在ORM中调用独立表,父类,以及映射到子类的从属表。我们在描述这些类时使用的术语是子类属于父类,这相当于说依赖表在其中一个字段上具有外键约束,并且独立表为指称物。 相比之下,Parent类具有子类,这相当于说依赖表是依赖表中字段的外键约束中的引用对象

假设A类属于B类,这种关系可能是一对一的对应关系,其中每个A只能属于一个B,而每个B只能有一个A.这是最不常见的情况,但是。大多数情况是一对多,其中每个A恰好属于一个B,但每个B可能有零,一个或多于一个A.这种关系称为一对多。例如,用户可以有多个电子邮件地址

最后的转折是有时这两个类可能处于多对多的关系中。这几乎总是通过第三张表来实现。这种关系的一个例子是堆栈溢出问题,它可能有许多标签,每个标签适用于许多问题。一些ORM可能有一个概念,即一个人可以属于另一个而没有关系是反身的,但是大多数ORM称之为“拥有并且属于许多

答案 1 :(得分:0)

我仅将:has_one用于“外来”表中定义的一对一关系。这是一个简单的指南:http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality