问题标签 [sql]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#:除了 DataSet 你还用什么
我发现自己对 .Net 中的 DataSet/DataTable/DataRow 范式越来越不满意,主要是因为它通常比我真正想做的要复杂几个步骤。在我绑定到控件的情况下,DataSet 很好。但在其他情况下,似乎有相当多的精神开销。
我已经使用 SqlDataReader 玩了一些,这对于通过选择进行简单的短途旅行似乎很有用,但我觉得可能还有一些其他模型潜伏在 .Net 中,它们对了解更多信息很有用。我觉得我在这方面找到的所有帮助都默认使用 DataSet。也许那和 DataReader 真的是最好的选择。
我不是在寻找最好/最差的故障,只是想知道我的选择是什么以及你有什么经验。谢谢!
-埃里克·斯普尔
sql - 为什么我们需要实体对象?
我真的需要看到一些关于当前接受的企业应用程序设计范式优点的诚实、深思熟虑的辩论。
我不相信实体对象应该存在。
我所说的实体对象是指我们倾向于为我们的应用程序构建的典型事物,例如“Person”、“Account”、“Order”等。
我目前的设计理念是这样的:
- 所有数据库访问都必须通过存储过程完成。
- 每当您需要数据时,调用存储过程并遍历 SqlDataReader 或 DataTable 中的行
(注意:我还使用 Java EE 构建了企业应用程序,Java 人员请用等价物代替我的 .NET 示例)
我不反对OO。我为不同的目的编写了很多类,而不是实体。我承认我写的大部分类都是静态辅助类。
我不是在制造玩具。我说的是跨多台机器部署的大型、大容量事务应用程序。Web 应用程序、Windows 服务、Web 服务、b2b 交互,应有尽有。
我用过 OR 映射器。我已经写了几篇了。我使用了 Java EE 堆栈、CSLA 和其他一些等价物。我不仅使用过它们,而且还在生产环境中积极开发和维护这些应用程序。
我得出了久经考验的结论,实体对象正在阻碍我们,我们的生活将如此得多。
考虑这个简单的例子:你接到一个关于你的应用程序中某个页面不能正常工作的支持电话,也许其中一个字段没有像它应该的那样被持久化。使用我的模型,分配来查找问题的开发人员恰好打开了 3 个文件。一个 ASPX、一个 ASPX.CS 和一个带有存储过程的 SQL 文件。该问题可能是存储过程调用中缺少参数,需要几分钟才能解决。但是对于任何实体模型,您总是会启动调试器,开始单步执行代码,最终您可能会在 Visual Studio 中打开 15-20 个文件。当你走到栈底时,你已经忘记了从哪里开始。我们一次只能在脑海中保留这么多东西。软件非常复杂,无需添加任何不必要的层。
开发复杂性和故障排除只是我抱怨的一方面。
现在让我们谈谈可扩展性。
开发人员是否意识到,每次编写或修改与数据库交互的任何代码时,他们都需要彻底分析对数据库的确切影响?不仅仅是开发副本,我的意思是模拟生产,所以您可以看到您现在为您的对象需要的附加列刚刚使当前查询计划无效,并且在 1 秒内运行的报告现在需要 2 分钟,只是因为您在选择列表中添加了一列?事实证明,您现在需要的索引太大以至于 DBA 将不得不修改文件的物理布局?
如果你让人们通过抽象离物理数据存储太远,他们将对需要扩展的应用程序造成严重破坏。
我不是狂热者。如果我错了,我可以确信,也许我错了,因为对 Linq to Sql、ADO.NET EF、Hibernate、Java EE 等的推动力如此之大。请仔细考虑你的回答,如果我遗漏了什么我真的很想知道它是什么,以及为什么我应该改变我的想法。
[编辑]
看起来这个问题突然又活跃起来了,所以现在我们有了新的评论功能,我已经直接评论了几个答案。感谢您的回复,我认为这是一个健康的讨论。
我可能应该更清楚我在谈论企业应用程序。我真的无法评论,比如说,在某人的桌面上运行的游戏或移动应用程序。
为了回应几个类似的答案,我必须把一件事放在首位:正交性和关注点分离经常被引用为使用实体/ORM 的理由。对我来说,存储过程是我能想到的关注点分离的最好例子。如果您不允许通过存储过程以外的所有其他方式访问数据库,那么理论上您可以重新设计整个数据模型并且不会破坏任何代码,只要您维护存储过程的输入和输出即可。它们是合同编程的完美示例(只要您避免“选择 *”并记录结果集)。
问一个在这个行业工作了很长时间并使用过长期应用程序的人:在数据库存在的情况下,有多少应用程序和 UI 层来了又去?当有 4 或 5 个不同的持久层生成 SQL 以获取数据时,调整和重构数据库有多难?你什么都改变不了!ORM 或任何生成 SQL 的代码都将您的数据库锁定在石头上。
sql - 表扫描和聚集索引扫描有什么区别?
既然 aTable Scan
和 aClustered Index Scan
本质上都扫描表中的所有记录,那么为什么聚集索引扫描应该更好呢?
举个例子 - 当有很多记录时,以下之间的性能差异是什么?:
sql - 最喜欢的性能调优技巧
当您有一个需要性能调整的查询或存储过程时,您首先尝试的是什么?
sql - 您选择的报告工具是什么?
每个项目总是需要某种类型的报告功能。从您选择的语言中的 foreach 循环到完整的 BI 平台。
为了完成工作,团队使用了哪些工具、小部件、平台来实现成功、挫折和失败?
sql - oracle的'yy'和'rr'日期掩码有什么区别?
例子:
和
返回不同的结果
sql - 如何在表格中进行 Upsert?
我有一个视图,其中包含工作列表,其中包含诸如分配给谁以及他们所处阶段之类的数据。我需要编写一个存储过程来返回每个人在每个阶段有多少工作。
到目前为止,我有这个(简化):
问题在于行不合并。因此,如果工作人员在 stage1 和 stage2 中有工作,那么@ResultTable 中有两行。我真正想做的是更新该行,如果存在该行,则如果该行不存在,则插入一个新行。
有谁知道如何做到这一点,或者可以提出不同的方法?我真的很想避免使用游标来迭代用户列表(但这是我的后备选项)。
我正在使用 SQL Server 2005。
编辑:@Lee:不幸的是 InStage1 = 1 是一种简化。它真的更像 WHERE DateStarted IS NOT NULL 和 DateFinished IS NULL。
编辑:@BCS:我喜欢先插入所有员工的想法,所以我只需要每次都进行更新。但我正在努力让那些 UPDATE 语句正确。
sql - 如何在 SQL 中请求随机行?
如何在纯 SQL 中请求随机行(或尽可能接近真正随机)?
sql - SQL Server 2005 Reporting Services 中的自定义字体
我的 SQL Reporting Services 报告有问题。我正在为报告标题使用自定义字体,当部署到服务器时,当我打印或导出为 PDF/TIFF 时,它无法正确呈现。我已经在服务器上安装了字体。为了使用自定义字体,我还需要做些什么吗?
在浏览器中查看字体时,它看起来是正确的 - 因为所有客户端计算机都安装了字体......
谢谢瑞安,您在常见问题解答中的帖子解决了这个问题。在服务器上安装字体修复了打印问题,以及图表问题(也在服务器上呈现)。正如您所指出的(以及在常见问题解答中提到的)Reporting Services 2005 不会在 PDF 文件中嵌入字体。我想现在还可以——最重要的部分是能够点击打印并获得正确的字体。
常见问题解答中回答了字体没有立即显示的原因:
问:我已经在我的客户端/服务器上安装了字体,但我仍然看到 ? 或黑框。为什么?答:对于客户端计算机,关闭 PDF 查看器的所有实例然后重新打开它们应该可以解决问题。
对于服务器,重新启动服务应该允许 PDF 渲染器获取新的字体信息。
不幸的是,我也看到过需要重新启动机器才能让客户端/服务器识别新安装的字体的情况。
sql - 我应该使用哪个 RDBMS?
我开发了一个用于通过 Internet 传输数据的高速事务服务器,因此我不需要依赖像 MySQL 这样的数据库实现来提供它。这就提出了使用哪个 SQL 版本的问题?
我真的很喜欢 SQLite,但我不相信它具有工业实力,但我喜欢的是它在资源上的轻量级。
8 年前我讨厌 MySQL,但现在它显然是工业实力,我的合作伙伴都在使用它,所以它是服务器端的明显选择。如果我使用它,我将通过“localhost”连接到已安装的服务器(Windows 服务)。我担心的是内存使用情况。
我没有将结果集加载到内存中,但我注意到第一次连接大约 6Mb。我希望后续连接不是额外的 6MB!
如果我使用 libmysqld.dll 嵌入式库,那么每个新连接是否会将嵌入式客户端/服务器代码的新实例加载到内存中?我们假设是这样,因为每个进程都有自己的进程内存......
无论如何,手册指出,当使用 libmysqld 嵌入式服务器时,在逐行检索结果时,内存优势基本上会丢失,因为“内存使用量随着检索的每一行而递增,直到调用 mysql_free_result()。” http://dev.mysql.com/doc/refman/5.1/en/mysql-use-result.html
这意味着我必须使用已安装的服务。但这和嵌入式服务器一样快吗?
还有其他低成本的高可靠性口味吗?