Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结果集SQL限制的替代方法_Sql_Relational Database_Resultset - Fatal编程技术网

结果集SQL限制的替代方法

结果集SQL限制的替代方法,sql,relational-database,resultset,Sql,Relational Database,Resultset,我们使用标准化的SQL查询关系数据库。查询的结果是一个二维表;行和列 我真的很喜欢rdms的良好结构(老实说,我从未与其他db系统进行过专业合作)。但是查询语言,或者更确切地说,sql生成的结果集是影响性能的一个相当大的限制 让我们创建一个简单的示例:客户订单(1-n) 我想查询今年有订单的所有以字母“A”开头的客户,并显示每个客户的所有订单 我有两个选项来查询这些数据 选项1 使用两个表之间具有联接的单个查询加载数据。 缺点:传输到客户端的结果包含重复的客户数据,这表示开销 选项2 查询客户并

我们使用标准化的SQL查询关系数据库。查询的结果是一个二维表;行和列


我真的很喜欢rdms的良好结构(老实说,我从未与其他db系统进行过专业合作)。但是查询语言,或者更确切地说,sql生成的结果集是影响性能的一个相当大的限制

让我们创建一个简单的示例:客户订单(1-n) 我想查询今年有订单的所有以字母“A”开头的客户,并显示每个客户的所有订单

我有两个选项来查询这些数据

选项1 使用两个表之间具有联接的单个查询加载数据。 缺点:传输到客户端的结果包含重复的客户数据,这表示开销

选项2 查询客户并启动第二个查询以加载他们的订单。 缺点:2个查询会导致两倍的网络延迟,第二个查询的延迟可能非常大,这可能会导致违反查询长度限制,性能不是最佳的,因为这两个查询都会形成订单的联接/过滤

当然有一个选项三,我们从orders表开始查询

因此,通常存在一个问题,我们必须根据具体情况来估计什么是更好的贸易。具有数据开销的单个查询或执行时间较短的多个查询。这两种策略在复杂的情况下都是不好的,因为在复杂的情况下,必须查询大量规范化格式的数据

因此,理想情况下,SQL能够以对象结构的形式指定查询结果。想象一下,查询结果的结构是xml或json,而不是表。如果您曾经使用过类似ORM的EntityFramework,您可能知道“Include”命令。有了sql中类似于“include”的命令的支持,并且返回的结果不是join,而是对象结构,world将是一个更好的地方。另一个场景是类似include的查询,但没有重复项。所以基本上一个结果中有两个表。要可视化it结果,可以如下所示:

{
  { customer 1 { order 1 order 2} }
  { customer 2 { order 3 order 4} }
} or
{
  { customer1, customer2 }
  { order1, order2, order3, order4 }
}
MS SQL Server有一个功能“多个结果集”,我认为这非常接近。但它不是标准SQL的一部分。我也不确定ORM映射程序是否真的使用了这种功能。我假设仍然执行两个查询(但一个客户端到服务器的请求)。而不是像“选择客户包括来自客户的订单加入客户以“A”开头的订单和订单…”


你一般都面临同样的问题吗?如果是这样,你怎么解决?您知道一种数据库查询语言可以做到这一点吗?即使现有的ORM映射程序支持这种语言(可能不支持)?我没有其他数据库系统的实际工作经验,但我不认为所有新的数据库系统都能解决这个问题?(当然还有其他问题)有趣的是,据我所知,图形数据库中的连接基本上是免费的。

我认为您可以更改应用程序工作流来解决这个问题。 新的应用程序工作流:

  • 查询以字母“a”开头的客户表。将结果发送到客户端以供显示
  • 用户从客户端选择一个客户,并将客户id发送回服务器
  • 根据客户id查询订单表,并将结果发送给客户进行显示

  • 有可能在某些SQL Server上返回json。如果您有一个表a与表B相关,并且表中的每个条目都指向表a中的最大一个条目,那么您可以按照所述减少流量过载。例如,可以是地址和他们的联系人

    SELECT * FROM Address
    JOIN Contact ON Address.AddressId = Contact.AddressId
    FOR JSON AUTO
    
    SQL返回结果将更小:

    "AddressId": "3396B2F8",
    "Contact": [{
            "ContactId": "05E41746",
            ... some other information
        }, {
            "ContactId": "025417A5",
            ... some other information
        }, {
            "ContactId": "15E417D5",
            ... some other information
        }
        }
    ]
    
    但实际上,我不知道有哪种ORM处理JSON以减少流量。 如果你有一些不同地址的联系人,可能会适得其反

    不要忘记JSON也有一些上手,需要序列化和反序列化

    如果SQL Server将连接的结果拆分为多个结果集,并且客户机分别使用对象关系映射器将它们映射在一起,则流量减少的最佳效果就是。如果你能找到解决问题的办法,我会很感兴趣的


    另一种思路是使用图形数据库。

    当你说标准SQL时,你是指ISO/IEC 9075-2,即ISO/ANSI SQL标准吗?我不想提及特定的标准版本,因为据我所知,现有的SQL标准都不支持这种查询功能,我认为,就这个问题而言,这并不重要。使用术语标准化sql,我想用sql92描述的方式来表达查询数据的能力。“sql生成的结果集在总体上是一个影响性能的相当大的限制”——可能是根据一些不合理的未声明的假设。你的问题太笼统了&不过很容易找到重复的问题。而要求提供产品是离题的。PS一张桌子的图片是二维的。n列表表示参与n元关系(ship)/关联的n维点集。我想我已经很有逻辑地说明了为什么它会影响性能,或者不如它所能表现的那么好,关于返回的重复数据或需要的多个查询。“不合理”是指在没有给出理由的情况下写得不合理;)这是一个相当广泛的问题,是真的:/,但不是。人们唯一要问的是关于连接和子查询的问题。如果你能链接一个解决问题的链接,我会很高兴。这个问题有点令人绝望,可能的答案我不清楚。是的,在很多情况下,性能可以通过你为应用程序选择的设计/工作流来优化。但这只是一个简单的例子。情况有时更为复杂。该问题旨在解决这样的情况,即必须请求来自具有复杂筛选器的多个表的大量数据。