我不太确定stackoverflow是否适合提出这样一个一般性的问题,但让我们试试看.

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

好吧,假设我们的应用程序中有一些面向对象的逻辑,并且对象以某种方式相互关联.我们需要将这个逻辑映射到存储逻辑,所以也需要数据库对象之间的关系.这就导致我们使用关系数据库,我同意这一点——简单地说,我们的数据库表行有时需要引用其他表的行.But why use SQL language for interaction with such a database?

SQL查询是一条文本消息.我可以理解这对于真正理解它的功能来说是很酷的,但是在应用程序的一部分中使用文本表和列名,这不是很愚蠢吗?如果你必须从头开始编写数据存储,你就永远不会使用这种解决方案.就我个人而言,我会使用一些"已编译的db查询"字节码,这些字节码将在客户端应用程序中组装一次并传递到数据库.它肯定会用id号来命名表和冒号,而不是ascii字符串.在表 struct 发生变化的情况下,这些字节查询可以根据新的数据库模式重新编译,存储在XML或类似的格式中.

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

让我的问题更清楚.大多数答案都声称,SQL作为一种文本查询,可以帮助开发人员更好地理解查询本身,并更容易地进行调试.就我个人而言,我已经有一段时间没有看到人们手工编写SQL查询了.我认识的每个人,包括我在内,都在使用ORM.在这种情况下,我们建立了一个新的抽象级别来隐藏SQL,这会导致我们思考是否需要SQL.如果您能给出一些例子,说明SQL是在没有ORM的情况下故意使用的,以及为什么使用,我将不胜感激.

EDIT2 SQL是人和数据库之间的接口.问题是why do we have to use it for application/database interaction?我仍然要求提供人类编写/调试SQL的示例.

推荐答案

如果您只需要将一些应用程序数据存储在某个地方,那么通用RDBMS甚至SQLite可能会有些过头.在某些情况下,序列化对象并将其写入文件可能更简单.SQLite的一个优点是,如果您有大量此类信息,那么这些信息都包含在一个文件中.缺点是阅读起来比较困难.例如,如果将数据序列化为YAML,则可以使用任何文本编辑器或shell读取该文件.

就我个人而言,我会用一些

一些数据库API就是这样工作的.查看静态SQL和准备好的语句.

我有什么理由不这么做吗

如果您需要很多功能,那么在某个时候,使用现有的RDMBS将比从头开始编写自己的数据库更容易.如果你不需要很多功能,一个更简单的解决方案可能更明智.

数据库产品的全部目的是避免 for each 新程序编写数据库层.是的,现代RDMBS可能并不总是完美适合每个项目.这是因为它们的设计非常通用,所以在实践中,您总是会获得不需要的附加功能.这并不意味着有一个定制的解决方案更好.手套并不总是需要完美贴合.

UPDATE:

但是为什么要使用SQL语言来

问得好.

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

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

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

"……应用程序和终端活动独立于数据类型的增长和数据表示的变化."

在关系模型出现之前,数据库的主流技术被称为网络模型.在这个模型中,程序员必须知道数据的磁盘 struct ,并手动遍历树或图形.关系模型允许用户根据概念或逻辑方案编写查询,该方案独立于磁盘上数据的物理表示.逻辑模式与物理模式的这种分离就是我们使用关系模型的原因.关于这个问题的更多信息,请看here张来自数据库类的幻灯片.在关系模型中,我们使用基于逻辑的查询语言(如SQL)来检索数据.

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

In summary, we use SQL because we happen to use the relational model for our databases.

如果您理解关系模型,就不难理解为什么SQL是这样.因此,基本上,您需要更深入地研究关系模型和数据库内部 struct ,以真正理解我们为什么使用SQL.否则可能有点神秘.

UPDATE 2:

SQL是人机界面

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

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

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

Sql相关问答推荐

AWS Athena将SON对象数组解析到行

根据内容确定要插入的列

Group By子句返回太多行

从列的不同值创建列

使用Mac日志(log)时间找出SQL中的好小时和坏小时

在SQL中将相同且紧挨着的元素进行分组

基于多个字段删除Access中的重复记录,同时保留最低优先级

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

基于唯一值在Access查询中创建计数器

如何根据行状态设置正确的标志

在xml.Modify方法中使用子字符串和可能的替代方法

在SQL查询中查找客户端的最短日期比较列和多行

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

避免在SQL中使用具有相同条件的多个子查询

每组使用平均值来填补缺失值的SQL

自动生成计算频率的列

如何对 SQL 表中的连续时间戳进行分组?

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

查找具有相同连接列数据的所有记录

SQL查询以获取从特定可变日期看到的用户