为什么使用SQL数据库?

为什么使用SQL数据库?,sql,database,database-design,data-structures,Sql,Database,Database Design,Data Structures,我不太确定stackoverflow是否适合提出这样一个一般性的问题,但让我们试一试 由于需要在某处存储应用程序数据,我一直使用MySQL或sqlite,只是因为它总是这样做。由于似乎全世界都在使用这些数据库(大部分是软件产品、框架等),像我这样的新手很难开始考虑这是否是一个好的解决方案 好的,假设我们的应用程序中有一些面向对象的逻辑,并且对象之间以某种方式相互关联。我们需要将此逻辑映射到存储逻辑,因此也需要数据库对象之间的关系。这就导致我们使用关系数据库,我同意这一点——简单地说,我们的数据库

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

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

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

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

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

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


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

是的,必须编写SQL语句来存储和检索对象,这很烦人

这就是为什么微软在C#和VB.NET中添加了LINQ(语言集成查询)这样的东西,使使用对象和方法而不是字符串查询数据库成为可能

大多数其他语言都有相似之处,成功的程度取决于该语言的能力


另一方面,了解SQL的工作原理是很有用的,我认为完全避免使用SQL是错误的。如果使用数据库时没有考虑到可能会编写效率极低的查询并错误地索引数据库。但是,一旦您了解了如何正确使用SQL并对数据库进行了调优,您就有了一个功能强大、经过测试的工具,可以非常快速地准确地找到所需的数据。

有很多非关系数据库系统。以下是一些:

创建SQL是为了提供一个接口,对关系数据库进行特殊查询

通常,大多数关系数据库都理解某种形式的SQL

存在面向对象的数据库,并且(大概)使用对象进行查询。。。但据我所知,OO数据库有很多被偷听的内容,关系数据库工作得很好

关系数据库还允许您在“断开连接”状态下操作。获得所需信息后,可以关闭数据库连接。对于OO数据库,您需要返回与当前数据库相关的所有对象(以及它们与…和…等相关的对象),或者在访问新对象时重新打开连接以检索新对象

除了SQL之外,您还可以使用ORM(对象关系映射)将对象映射到SQL和SQL。其中有很多,包括LINQ(.NET)、MS实体框架(.NET)、Hibernate(Java)、SQLAlchemy(Python)、ActiveRecord(Ruby)、Class::DBI(Perl)等
  • 这是一个普遍存在的标准。几乎所有编程语言都有一种访问SQL数据库的方法。用专有的二进制协议试试
  • 大家都知道。你可以很容易地找到专家,新开发人员通常会在某种程度上理解它,而不需要培训
  • SQL与关系模型密切相关,关系模型在优化和可伸缩性方面得到了深入的研究。但它仍然经常需要手动调整(索引创建、查询结构等),这由于文本界面的缘故相对容易

  • 如果第一部分似乎指的是通常称为对象关系映射的内容。已经有很多框架来缓解这个问题。还有贸易。有些事情会更容易,有些事情会变得更复杂,但在一般情况下,如果你能负担得起额外的一层,它们工作得很好

    在第二部分中,您似乎抱怨SQL是文本(它使用字符串而不是ID等)。。。SQL是一种查询语言。任何人类阅读或书写的语言(计算机或其他)都是面向文本的。汇编,C,PHP,随便你说。为什么?因为,嗯。。。这是有道理的,不是吗

    如果您想要预编译查询,那么您已经有了存储过程。准备好的语句也会在运行中编译一次,IIRC。大多数(如果不是全部的话)db驱动程序使用二进制协议与数据库服务器通信