`
jbf034
  • 浏览: 153159 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

表之间的关系

阅读更多
大多数应用程序都是使用数据库的多个表的,而且一些表之间还存在着一些关联。定单
Orders有多个商品项目。一个商品项目将引用一个特殊的产品。一个产品可能属于许多不同
的产品分类目录,而每个分类目录有许多不同的产品。
数据库schema中,这些关系是由基于主键的值来表达的。[关联的另一种风格是,model
对象与它的另一个子类的model之间的关系。在253页的15.3节讨论。]如果一个商品项目
引用了一个产品,则line_items表将就包括一个列,它持有与products表中记录相对应的
主键的值。从数据库的角度来说,line_items表被说成有个外键引用了products表。
但这些都是低级别的。在我们的程序中,我们要处理model对象及它们之间的关系,而
不是数据库的记录和主键列。如果一个定单有许多的商品项目,我们喜欢有多种方式来遍历
它。如果一条商品项目和一个产品关联,我们会说这很简单,例如
price = line_item.product.price
而不是
product_id = line_item.product_id
product = Product.find(product_id)
price = product.price
Active Record可以有rescue子句。它的ORM部分的的魔力就是,它把数据库中比较底
层的外健关系转化成高层的对象间的映射。它处理三种基本的情况。
1、表A的一个记录与表B的一个或0个记录关联
2、表A的一个记录于表B的任意多个记录关联
3、表A的任意多个记录与表B的任意多个记录关联。
我们必须在Active Record处理这些内部表的关系时稍微费点神。这不是Active Record
的缺点,它不可能从含有内部表关系的模式中推断出开发人员的意图。然而,我们所要作的
事情也是很少的。
创建外键
正如前面讨论的,当一个表包含一个外健指向另一个表的主键时两个表是关联的。在下
面的DDL,表 line_items包含一个外键指向表products和表orders。
create table products (
id int not null auto_increment,
title varchar(100) not null,
/* . . . */
primary key (id)
);
create table orders (
id int not null auto_increment,
name varchar(100) not null,
/* ... */
primary key (id)
);
create table line_items (
id int not null auto_increment,
product_id int not null,
order_id int not null,
quantity int not null default 0,
unit_price float(10,2) not null,
constraint fk_items_product foreign key (product_id) references
products(id),
constraint fk_items_order foreign key (order_id) references
orders(id),
primary key (id)
);
值得注意的是:不是外键约束条件来设置关系。这些只是一个数据库的提示而已,它检
查目标表中对应的列值。DBMS一般会忽略这些约束条件。(MySQL有些版本就是这样)因为
开发人员选择从products和orders表中的值来控制列product_id和order_id的主键值,
表之间的关系就是这样非常简单的建立起来了。
查看这个DDL,我们可以看到为什么对Active Record自动猜测表之间的关系是非常困
难的。在line_items表中引用的orders和products表外键看上去是唯一的。但是,
product_id列是一个与product相关联的商品项目。order_id列是多个商品项目和一个order
相关联的。商品项目是order的一部分,但是它引用了product。
这个例子也显示了标准的Active Record命名约定。外键列应该被命名在目标表的类名
之后,并被转化为小写,再附加_id。注意,复数和附加的_id两者的转换,假设外键名字将
由引用的表不同部分组成。如果你有个Active Record model叫Person,它将映射数据库表
people。一个外键引用一些其它表到people表将有个列名叫person_id。
The other type of relationship is where some number of one thing is related
to some number of another thing (such as products belonging to multiple
categories, and categories that contain multiple products). The SQL 约定使用第三个表,叫join的表来处理它。join表包含了一个用于它连接的每个表的外键,所以join表内每行都表示两个其它表之间的连接。
create table products (
id int not null auto_increment,
title varchar(100) not null,
/* . . . */
primary key (id)
);
create table categories (
id int not null auto_increment,
name varchar(100) not null,
/* ... */
primary key (id)
);
create table categories_products (
product_id int not null,
category_id int not null,
constraint fk_cp_product foreign key (product_id) references
products(id),
constraint fk_cp_category foreign key (category_id) references
categories(id)
);
依靠schema,你可能想放置额外的信息给join表,或许是描述被加入的两个类之间自
然关系。
Rails假设一个join表被命名为两个被加入的表名字(名字按字母表次序)。Rails将自
动地找到join表categories_products来连接categories和products。如果你使用一些其
它名字,你需要添加一个声明给Rails,以便它能找到它们。
指定关系
Active Record支持三种表之间的关系类型:一对一,一对多,多对多。你可以通过在
model中加入声明has_one,has_many,belongs_to,和has_and_belongs_to_mang等来表明
关系。
一对一的关系存在于orders和invoices表之间:每个order最多有一个invoice。我
们在Rails这样来声明它
class Order < ActiveRecord::Base
has_one :invoice
. . .
class Invoice < ActiveRecord::Base
belongs_torder
. . .
定单和商品项目之间一对多关系:可以任意数量的商品项目与一个特定的定单关联。
ails中,我们这样编码
class Order < ActiveRecord::Base
has_many :line_items
. . .
class LineItem < ActiveRecord::Base
belongs_torder
. . .
我们可能要给我们的products分类。一个product属于多个类别,每个类别包含多个
roduct。这就是多对多的关系,在Rails中这表示
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
. . .
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
. . .
各种连接声明要比表之间特定关联做的要更多。它们每个都可添加很多方法来帮助在
连接的对象间操作。让我们看看这三个不同种类内部连接上下文环境中的更多细节。我们
将查看考绩个方法。我们在233页图14.5中总结它们,相关的方法可查看RDoc文档。
分享到:
评论

相关推荐

    SAP各模块表之间的关系图(WORD版)

    SAP 各模块表之间的关系图(WORD 版) SAP 是一种集成了企业资源计划、供应链管理、客户关系管理、财务管理、人力资源管理等功能的企业管理软件。该软件的 Core 是基于关系数据库的,因此了解 SAP 中各模块表之间的...

    数据库表之间的关系-关系图

    通过实例学会数据库表之间的相互关系,并用图形的方式展现出来,简单易懂,非常适合初学者。

    sap 表之间的关系

    SAP 表之间的关系是 SAP 系统核心功能的基础,它们允许系统处理业务流程并保持数据一致性。下面我们将详细探讨 SAP 表之间的关系以及如何理解和利用这些关系。 1. **主表和从表**:在 SAP 中,主表(Master Table)...

    JBPM数据表之间的关系

    了解JBPM数据表之间的关系对于深入理解和开发基于JBPM的应用至关重要。以下是对JBPM主要数据库表及其关联的详细说明: 1. **JBPM_PROCESSDEFINITION**: - ID_:此字段是流程模版的唯一标识,用于区分不同的流程...

    access建立表之间的关系

    **定义表之间的关系** 在Access中,定义表间关系的过程如下: 1. 确保没有打开的表,因为不能在已打开的表之间创建或修改关系。 2. 打开“数据库”窗口,可以通过按F11键来切换。 3. 使用“显示表”对话框选择需要...

    在Excel中创建两个表之间的关系完整版资料.pptx

    在Excel中创建两个表之间的关系是一项重要的数据管理任务,尤其对于处理复杂的数据集时非常有用。这通常涉及到数据库设计中的关系模型概念,如一对一、一对多和多对多关系。在这个案例中,我们关注的是一个典型的多...

    SAP系统前台数据与后台表之间的关系

    理解SAP系统前台数据与后台表之间的关系对于系统维护、报表开发和问题排查至关重要。 1. 前台数据与后台表的初步关联: 用户在前台界面看到的数据通常并非直接来自后台数据表,而是经过系统处理的结果。通过点击...

    电梯系统据库设计以及各个表之间的关系和UML软件建模等--超全的文档资料

    其次,表之间的关系是数据库设计的核心。电梯与楼层之间一般是一对多的关系,一个电梯对应多个楼层;用户可以对多个电梯进行操作,形成多对多的关系,这可能需要通过中间表来实现;电梯与维修记录和故障报告之间是一...

    浅谈SAP系统前台数据与后台表之间的关系优质资料.doc

    SAP 系统前台数据与后台表之间的关系优质资料 本文将深入探讨 SAP 系统前台数据与后台表之间的关系,详细介绍了四种方法来关联前台数据与后台表。 在 SAP 系统中,用户在进行日常业务的过程时,经常会因为操作不...

    网络基础+几张表之间的关系

    网络基础+几张表之间的关系

    BSEG与几张子表之间的关系

    BSEG与其他几个子表——BSIS、BSAS、BSID、BSAD、BSIK和BSAK之间的关系是构成完整的财务凭证处理和清账流程的关键。 1. **BSAS与BSIS**: - **BSAS(已清总账明细)**:这张表用于存储已经清账的总账行项目信息。...

    计算机前端-实战.目视频2-06.理清rbac表之间的关系.wmv

    计算机前端-实战.目视频2-06.理清rbac表之间的关系.wmv

    数据库系统设计大全,包括数据库的设计步骤和具体流程,如何设计,以及用具体的事例实现等,还包括UML模型,以及表之间的关系等。

    在这个阶段,确定主要实体(如用户、商品、订单)和它们之间的关系,如一对一、一对多或多对多。同时,定义每个实体的属性和约束条件。 3. **逻辑设计**:将E-R模型转换为关系模型,形成关系数据模型,包括各个表的...

    表关系的创建设置

    我们需要设置的关系可能包括:学生表与选课成绩表之间的关系(通过学号连接),以及选课成绩表与课程表之间的关系(通过课程号连接)。通过这样的关系设置,我们可以方便地查询到每个学生的所有课程成绩,或者查看某...

    SAP 表之间的关系(不全)

    表之间关系可能不全,个人使用目前只有这么多。先用着吧

    SAP表结构,关于SAP各table之间的关系

    表之间的关系主要有以下几种: 1. 一对一关系:一个主表对应一个从表,例如,一个员工主表可能有一个从表存储员工的详细信息,如地址、联系电话等。 2. 一对多关系:一个主表对应多个从表,例如,一个订单主表可能...

    activiti表结构说明及关联关系pdm

    而“activiti5.22.pdm”则很可能是Process Definition Model文件,它使用建模工具(如Eclipse BPMN2插件)创建,描述了具体的业务流程逻辑和流程元素之间的关系。 在PDM文件中,你可以找到以下关键要素: - 流程...

    SAP所有表关系

    SAP中所有透明表以及其相互之间的联系,非常有用

    通过解析sql语句获取表血缘关系项目

    - 构建和维护血缘关系图,表示各个表之间的关系。 总结来说,"通过解析SQL语句获取表血缘关系项目"是一个关键的数据管理实践,它依赖于对SQL的深入理解和合适的工具,以揭示数据库中的数据流动路径,从而支持更...

    SAP SD模块主表关系详解

    这些表格之间的关系非常紧密,通过它们之间的链接可以实现数据的追踪和验证。 ### 销售订单(Sales Order) #### 主要表格:VA01 - **VBAK (Sales Order Header)**:该表格存储了销售订单的基本信息,如订单编号、...

Global site tag (gtag.js) - Google Analytics