草庐IT

mysql - 复杂查询的 View 或存储过程?

coder 2023-06-11 原文

我有一个包含多个(嵌套)子查询的有点复杂的查询,我希望将其提供给应用程序开发人员。该查询是通用的,并在数据集的集合上生成具有计算值的 View ,并且开发人员预计只需要查询返回的一些记录(即,它们将限制某些实体的 ID 或日期范围或某些的结果这样)。

我可以看到 3 种实现方式:

  1. 让开发人员将查询嵌入到每个应用程序中,并根据需要添加自己的 WHERE 子句。
  2. 创建一个存储过程,它接受我希望开发人员需要的所有条件作为参数(为了论证,假设我可以预测在可预见的 future 需要什么),并且该过程将运行复杂的查询并根据传递的参数进行过滤。
  3. 将查询实现为具有多个 subview 的 View (因为 MySQL 不允许 View 中的子查询)并让开发人员将其用作表并使用 WHERE 让每个应用程序都适用他们需要的过滤器。目前我正在查看 3 个额外的 subview ,主要是因为一些子查询被多次使用,并且将它们作为 subview 来防止重复 - 否则可能会更糟;-)。

什么是更好的性能明智的? (假设所有索引在所有情况下都是等效的)如果可能,请尝试最坏的情况。

您认为在代码维护方面什么会更好?

最佳答案

我喜欢定义“好”的问题 - 您专门询问了性能和可维护性,这使得答案可以讨论这种权衡。

从性能的角度来看,只要查询和数据符合您的预期方案,我认为这 3 个选项之间可能没有任何区别。我会用 100 倍的数据进行测试,并可能会扩大“where”子句以查看会发生什么,但索引结构等更有可能影响性能,而不是您是否从存储过程中执行相同的 SQL,通过查看,或从客户端应用程序。

回答这个问题的最佳方法是测试它 - 当然,有许多具体的细节可能会使我们的泛泛者可以给出的“我希望 x、y 或 z”的一般答案无效。如果性能是一个关键问题,请使用数据库填充工具(Redgate make on,我过去使用过 DBMonster)并尝试所有 3 个选项。

从维护的角度来看,我会提供选项 4,在我看来,它是迄今为止最好的。

选项 4:构建一个数据访问库,封装对数据的访问。让库公开方法和参数以优化记录的选择。考虑使用规范模式 (http://en.wikipedia.org/wiki/Specification_pattern)。使用库中最好的任何查询,不要用实现细节打扰开发人员。

如果这不起作用 - 异构应用程序代码,对于一个简单的需求来说变化太大 - 我会评估以下选项:

  1. 嵌入式 SQL:取决于此 SQL 被重复使用的次数,这可能没问题。如果只有一部分代码运行 SQL,它在逻辑上类似于数据访问库。然而,如果相同的代码片段需要在很多地方重复使用,那么它很可能是错误的来源——SQL 中的一个小改动需要在多个地方重复。

  2. 存储过程:出于维护原因,我通常不喜欢存储过程——它们往往会因过载而变得脆弱,并创建一种程序化的思维方式。例如,如果您对在单独的存储过程中使用此 SQL 计算有其他要求,那么您很快就会得到一个过程编程模型,存储过程相互调用。

  3. Views:这可能是最好的选择。它将特定的数据逻辑放在一个地方,但提倡使用基于集合的逻辑,因为访问路径是通过 SELECT 语句,而不是通过执行过程语句。 View 很容易合并到其他查询中。

关于mysql - 复杂查询的 View 或存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837185/

有关mysql - 复杂查询的 View 或存储过程?的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  9. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐