为什么数据库:为什么使用SQL数据库(sql used)

关于为什么数据库的问题,在sql used中经常遇到, 我不太确定 stackoverflow 是这样一个一般问题的地方,但让我们试一试。

我不太确定 stackoverflow 是这样一个一般问题的地方,但让我们试一试。

由于需要将应用程序数据存储在某个地方,我一直使用 MySQL 或 sqlite,只是因为它总是这样做。似乎整个世界都在使用这些数据库(大多数软件产品,框架等),对于像我这样的初学者来说,很难开始考虑这是否是一个好的解决方案。

好吧,假设我们的应用程序中有一些面向对象的逻辑,并且对象之间以某种方式相互关联。我们需要将此逻辑映射到存储逻辑,因此也需要数据库对象之间的关系。这导致我们使用关系数据库,我对此表示同意-简单地说,我们的数据库表行有时需要引用其他表的行。但是为什么要使用 SQL 语言与这样的数据库进行交互?

SQL 查询是一个文本消息。我能理解这对于实际理解它的作用是很酷的,但是对于部署后没有人见过的应用程序的一部分使用文本表和列名称不是很愚蠢吗?

我的想法有什么问题?我有什么理由不自己写,而是使用 SQL 数据库?

EDIT为了使我的问题更清楚。大多数答案声称 SQL 是文本查询,可以帮助开发人员更好地理解查询本身并更轻松地对其进行调试。就我个人而言,我已经有一段时间没有看到有人手工编写 SQL 查询了。我认识的每个人,包括我在内,都在使用 ORM。这种情况下,我们建立了一个新的抽象级别来隐藏 SQL,这可能是您故意的。

EDIT2SQL 是人与数据库之间的接口,问题是为什么我们必须将其用于应用程序 / 数据库交互?我仍然要求提供人类编写 / 调试 SQL 的示例。

43

我认识的每个人,包括我在内,都在使用 ORM

奇怪。我认识的每个人,包括我在内,仍然手工编写大部分 SQL。通常,与生成的解决方案相比,您最终会得到更紧密,更高性能的查询。而且,根据您的行业和应用程序,这种速度确实很重要。有时很多。是的,我有时会使用 LINQ 进行快速 n-dirty,在这种情况下,我并不真正关心所产生的 SQL 在大型手动环境中的

26

如果你需要做的只是将一些应用程序数据存储在某个地方,那么一个通用的 RDBMS 甚至 SQLite 可能会矫枉过正。在某些情况下,序列化你的对象并将它们写入文件可能会更简单。SQLite 的一个优点是,如果你有很多这样的信息,它都包含在一个文件中。一个缺点是它更难以阅读。例如,如果你将你的数据序列化为 YAML,你可以

就我个人而言,我会使用一些“编译 db 查询”字节码,这将在客户端应用程序中组装一次并传递给数据库。

这是一些数据库 API 的工作方式。查看静态 SQL 和准备好的语句。

我有什么理由不自己写,而是使用 SQL 数据库?

如果您需要很多功能,那么在某些时候使用现有的 RDMBS 会更容易,然后从头开始编写自己的数据库。

数据库产品的全部目的是避免为每个新程序编写数据库层。是的,现代 RDMBS 可能并不总是非常适合每个项目。这是因为它们被设计为非常通用,因此在实践中,您将始终获得不需要的其他功能。这并不意味着最好有一个自定决方案。手套并不总是需要完美的。

UPDATE:

但是为什么要使用 SQL 语言与这样的数据库进行交互呢?

问得好.

答案可以在 IBM 于 1970 年发表的 E.F.Codd 的描述关系模型A Relational Model of Data for Large Shared Data Banks的原始论文中找到。本文描述了当时现有数据库技术的问题,并解释了为什么关系模型更好。

使用关系模型以及像 SQL 这样的逻辑查询语言的原因是数据独立性。

本文将数据独立性定义为:

“……应用程序和终端活动与数据类型的增长和数据表示的变化无关。”

在关系模型之前,数据库的主要技术被称为网络模型。在此模型中,程序员必须知道数据的磁盘结构并手动遍历树或图。关系模型允许人们针对独立于磁盘上数据的物理表示的概念或逻辑方案编写查询。逻辑方案与物理方案的这种分离是我们使用关系模型的原因。有关此问题的更多信息,请参见

与研究论文中通常使用的查询语言相比,SQL 是一种易于键入计算机的查询语言。研究论文通常使用关系代数或关系演算来编写查询。

总而言之,我们使用 SQL 是因为我们的数据库恰好使用了关系模型。

如果你理解了关系模型,就不难看出为什么 SQL 是这样的。所以基本上,你需要更深入地研究关系模型和数据库内部,才能真正理解我们为什么使用 SQL。否则可能会有点神秘。

UPDATE 2:

SQL 是人类和数据库之间的接口。问题是为什么我们必须将其用于应用程序 / 数据库交互?我仍然要求人类编写 / 调试 SQL 的示例。

因为数据库是关系数据库,所以它只理解关系查询语言。在内部,它使用类似关系代数的语言来指定查询,然后将其转换为查询计划。因此,我们以我们可以理解的形式(SQL)编写查询,DB 接受我们的 SQL 查询并将其转换为内部查询语言。然后,它接受查询并尝试找到用于执行查询的“查询计划”。然后,它执行查询计划并返回结果。

在某些时候,我们必须以数据库理解的格式对我们的查询进行编码。数据库只知道如何将 SQL 转换为其内部表示,这就是为什么在链中的某个点总是有 SQL。它无法避免。

当您使用 ORM 时,您只需在 SQL 之上添加一个层。SQL 仍然存在,它只是隐藏的。如果您有一个更高级别的层将您的请求转换为 SQL,那么您不需要直接编写 SQL,这在某些情况下是有益的。有时我们没有这样的层能够执行我们需要的查询,因此我们必须使用 SQL。

12

鉴于您使用 MySQL 和 SQLite 的事实,我完全理解您的观点。大多数 DBMS 都具有需要从您身边进行一些编程的功能,而您可以免费从数据库中获取它:

索引-由于索引,您可以存储大量数据,并且仍然能够非常快速地进行过滤和搜索。当然,您可以实现自己的索引,但是为什么要重新发明轮子

数据完整性-使用数据库功能,如级联外键,可以确保整个系统的数据完整性。您只需要声明数据之间的关系,其余的由系统负责。当然,您可以再次在代码中实现约束,但这是更多的工作。例如,考虑删除,您必须在对象的析构函数中编写代码以跟踪所有依赖对象并相应地采取行动

能够用不同的编程语言编写多个应用程序,在不同的操作系统上工作,有些甚至分布在网络上-所有这些都使用存储在公共数据库中的相同数据

通过触发器实现观察者模式非常容易。在许多情况下,只有一些数据依赖于其他数据,并且不会影响应用程序的 UI 方面。确保一致性可能非常棘手或需要大量编程。当然,您可以使用对象实现类似触发器的行为,但它需要比简单的 SQL 定义更多的编程

10

这里有一些很好的答案。我将尝试添加我的两美分。

我喜欢 SQL,我可以很容易地想到它。由 DB 顶部的层(如 ORM 框架)产生的查询通常是可怕的。他们会选择大量额外的东西,加入您不需要的东西等;所有这些都是因为他们不知道您只需要此代码中对象的一小部分。当您需要高性能时,您通常会最终进入并在瓶颈 ORM 系统中使用至少一些自定义 SQL 查询。

为什么是 SQL?正如其他人所说,这对人类来说很容易。它是一个很好的最低公分母。任何语言都可以制作 SQL 并在必要时调用命令行客户端,它们几乎总是一个很好的库。

解析出 SQL 效率低下吗?有些。语法是 pretty structured,所以没有吨的歧义会使解析器的工作真的很难。真正的事情是解析出 SQL 的开销基本上是没有的。

假设你运行一个类似“SELECT x FROM table WHERE id = 3”的查询,然后一遍又一遍地用 4,然后是 5,在这种情况下,解析开销可能存在。这就是为什么你准备了语句 (正如其他人提到的)。服务器解析查询一次,并且可以在 3 和 4 和 5 中交换,而无需重新解析所有内容。

但这是微不足道的情况。在现实生活中,您的系统可能会加入 6 个表,并且必须提取数十万条记录(如果不是更多的话)。这可能是您让它在数据库集群上运行数小时的查询,因为这是在您的情况下执行操作的最佳方式。即使执行查询只需要一两分钟,与从磁盘上拉出记录并进行排序 / 聚合等相比,解析查询的时间基本上是免费的。

许多人在小型数据库上使用 SQL。我与之交互的最大的一个只有几十个 gigs。SQL 用于从微小文件 (像小 SQLite DB 可能) 到 TB 大小的 Oracle 集群的所有内容。考虑到它的强大功能,它实际上是一个令人惊讶的简单和小命令集。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(318)
小红帽杀毒软件:“红帽卫星”和“红帽网络卫星”的区别
上一篇
电脑怎么扫描文件:awsdynamodb扫描过滤器怎么写:
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(15条)