Database 如何一次获取对象图?

Database 如何一次获取对象图?,database,Database,我正在读一本书,书中作者谈到一步获取一行+所有链接的父行。就像一次提取一个订单+它的所有项目一样。好的,听起来不错,但实际上:我从来没有在SQL中看到过要求一个订单+100个项目的可能性?这套唱片看起来怎么样?我会得到101行订单和项目表的合并字段,其中100行订单字段有很多空值,而一行项目字段有很多空值吗?这是路吗?还是有更酷的东西?我是说。。。我从未听说过将数组提取到字段上?这通常是通过子句完成的。这不会导致许多空值,但会导致父行的许多重复值 另一个选项,如果您的数据库和编程语言支持,则可以

我正在读一本书,书中作者谈到一步获取一行+所有链接的父行。就像一次提取一个订单+它的所有项目一样。好的,听起来不错,但实际上:我从来没有在SQL中看到过要求一个订单+100个项目的可能性?这套唱片看起来怎么样?我会得到101行订单和项目表的合并字段,其中100行订单字段有很多空值,而一行项目字段有很多空值吗?这是路吗?还是有更酷的东西?我是说。。。我从未听说过将数组提取到字段上?

这通常是通过子句完成的。这不会导致许多空值,但会导致父行的许多重复值


另一个选项,如果您的数据库和编程语言支持,则可以在一个连接中返回两个结果集—一个选择父行,另一个选择相关行。

这通常通过子句完成。这不会导致许多空值,但会导致父行的许多重复值


另一个选项是,如果您的数据库和编程语言支持它,则需要在一个连接中返回两个结果集—一个选择父行,另一个选择相关行。

简单的连接即可:

SELECT     o.*
,          i.*
FROM       orders o
INNER JOIN order_items i
ON         o.id = i.order_id
将为order\u项目中的每行返回一行。返回的行由orders表中的所有字段组成,并连接到order_items表中的所有字段(确切地说,表中的记录是连接的,也就是说,它们通过记录连接进行组合)

因此,如果订单有(id、订单日期、客户id)和订单项目有(订单id、产品id、价格),上述语句的结果将包括(id、订单日期、客户id、订单id、产品id、价格)的记录

您需要注意的一点是,每当一个“主”有两个不同的“细节”表时,这种方法就会崩溃。让我解释一下

在orders/order_items示例中,orders是主订单,order_items是详细订单:order_items中的每一行都属于或仅依赖于orders中的一行。反之亦然:orders表中的一行在order\u items表中可以有零行或多行相关行。连接条件

ON o.id = i.order_id 
确保只合并并返回相关行(如果数据库允许您忽略联接条件,则省略该条件将重新返回两个表中所有可能的行组合)

现在,假设您有一个主数据和两个详细信息,例如,客户作为主数据,客户订单作为详细信息1和客户电话号码。假设您想要检索一个特定客户以及所有is订单及其所有电话号码。你可能会想写:

SELECT     c.*, o.*, p.*
FROM       customers                c
INNER JOIN customer_orders          o
ON         c.id                   = o.customer_id
INNER JOIN customer_phone_numbers   p
ON         c.id                   = p.customer_id
这是有效的SQL,它将执行(如果表和列名已就位) 但问题是,它会给你一个垃圾结果。假设您的客户有两个订单(1,2)和两个电话号码(A,B),您会得到以下记录:

customer-data | order 1 | phone A
customer-data | order 2 | phone A
customer-data | order 1 | phone B
customer-data | order 2 | phone B
这是胡说八道,因为它表明订单1与电话号码A和B之间存在某种关系,订单2与电话号码A和B之间存在某种关系

更糟糕的是,这些结果可能会导致记录数量急剧增加,这对数据库性能造成很大损害


因此,JOIN非常适合将已知深度的项目层次结构(客户->订单->订单项目)“展平”到一个大表中,该表只复制每个细节项目的主项目。但是提取相关项目的真实图表是可怕的。这是SQL设计方式的直接结果——它只能输出规范化的表而不需要重复组。这就是对象关系映射器的存在方式,允许从关系数据库中存储和检索具有多个从属对象依赖集合的对象定义,而不会失去程序员的理智。

一个简单的连接就可以做到这一点:

SELECT     o.*
,          i.*
FROM       orders o
INNER JOIN order_items i
ON         o.id = i.order_id
将为order\u项目中的每行返回一行。返回的行由orders表中的所有字段组成,并连接到order_items表中的所有字段(确切地说,表中的记录是连接的,也就是说,它们通过记录连接进行组合)

因此,如果订单有(id、订单日期、客户id)和订单项目有(订单id、产品id、价格),上述语句的结果将包括(id、订单日期、客户id、订单id、产品id、价格)的记录

您需要注意的一点是,每当一个“主”有两个不同的“细节”表时,这种方法就会崩溃。让我解释一下

在orders/order_items示例中,orders是主订单,order_items是详细订单:order_items中的每一行都属于或仅依赖于orders中的一行。反之亦然:orders表中的一行在order\u items表中可以有零行或多行相关行。连接条件

ON o.id = i.order_id 
确保只合并并返回相关行(如果数据库允许您忽略联接条件,则省略该条件将重新返回两个表中所有可能的行组合)

现在,假设您有一个主数据和两个详细信息,例如,客户作为主数据,客户订单作为详细信息1和客户电话号码。假设您想要检索一个特定客户以及所有is订单及其所有电话号码。你可能会想写:

SELECT     c.*, o.*, p.*
FROM       customers                c
INNER JOIN customer_orders          o
ON         c.id                   = o.customer_id
INNER JOIN customer_phone_numbers   p
ON         c.id                   = p.customer_id
这是有效的SQL,它将执行(如果表和列名已就位) 但问题是,它会给你一个垃圾结果。假设您的客户有两个订单(1,2)和两个电话号码(A,B),您会得到以下记录:

customer-data | order 1 | phone A
customer-data | order 2 | phone A
customer-data | order 1 | phone B
customer-data | order 2 | phone B
这是胡说八道,因为它表明订单1与电话号码A和B之间存在某种关系,订单2与电话号码A和B之间存在某种关系

更糟糕的是这些