据我所知,如果我想创建一个新的数据库,通常首先我必须创建并打开一个服务器(在这种情况下,在我的计算机本地服务器),其次我连接我的RDBMS(MySql)到我的本地服务器,第三我使用SQL来创建它。
首先我想知道是否有可能只使用硬盘创建一个数据库,而不创建任何服务器。
其次如果答案是“是”,那么使用服务器有哪些好处?
我是说,这是我的逻辑:如果我的本地服务器使用我的PC硬件(因此它必须使用我的硬盘来存储信息),为什么我必须使用它,而不是直接将信息存储在我的硬盘中?
如果不创建本地服务器,我的计算机将无法执行哪些本地服务器功能?
我必须承认,我不确定我的问题到什么程度才有意义,因为我可能不知道服务器的深度是多少,以及这个概念带来的所有可能性是什么。
我试着在网上寻找信息。事实上,我正在使用ChatGPT来帮助我了解任何我不知道的变量(尽管它有时会给出错误的信息,所以我试着对比它)。
事实是“我不知道我不知道的东西”,所以我想最好找个人来澄清我的疑惑,填补我的空白。
5条答案
按热度按时间7jmck4yq1#
SQLite是一个SQL数据库系统,它不使用单独的数据库服务器程序,它是一个代码库,简单地从你的程序中访问一个文件,它高效、轻量级、可移植,如果你有一个需要SQL但不需要共享数据的程序,它是非常好的,很多移动的App内部都使用本地SQLite数据库;你手机上可能有好几个。
大多数SQL数据库系统(MySQL、MariaDB、PostgreSQL、Oracle、Microsoft SQL Server、IBM DB2等)都使用单独的服务器,因为它们的主要设计目标是允许许多不同计算机上的许多不同用户共享相同的数据。如果我预订了12 C的座位,那么这个座位必须是不可预订的。客户机-服务器数据库系统处理这种数据共享所需的并发访问和事务控制。
从网络架构的Angular 来看,只能通过
localhost
连接的关系数据库服务器确实有些多余,但这些localhost
数据库服务器通常用于开发软件,当软件完成并部署后,它会连接到一个共享服务器。每种SQL数据库都有自己的SQL方言。许多广泛部署的应用程序(WordPress、Stack Overflow等)在很多年前选择了一种SQL方言,因此需要这种数据库。如果你为SQLite创建一个程序,然后不得不调整它以使用MySQL或Oracle,你就会遇到这种情况。大型昂贵的SQL数据库称这种现象为“客户锁定”。
最后,生产数据的生命周期通常比使用它的程序要长得多。我曾经为SQL数据库编写过代码,这些数据库包含20年前创建的表,当时每TB的硬盘存储都要花一大笔钱。客户端-服务器模型使这成为可能,而无需为每个新软件版本重新构建大量数据。
cedebl8k2#
我想我明白你所说的"只是硬盘"背后的用意,我稍后会回答你的问题,但有一些技术上的原因,使你的问题无效,主要是因为任何持久保存数据的数据库都是将数据储存在长期储存器中(又称"磁盘")、Mysql、MSSQL、MongoDB、Excel等最终都会将自己的数据写入磁盘,除此之外,很难直接回答您的问题的另一个原因是,无论如何都需要某种程序来与数据接口,在不同的层次上。MySQL有它的服务器软件,它的客户端cli,它的各种客户端连接器。MSSQL有它的服务器,它的Sql Server Management Studio客户端,各种连接器和第三方工具。Excel有... Excel,或者任何openoffice的替代品。所以必须有一些东西允许你与这些数据交互,并使它对需要它的各个端点可用。
我之所以认为我理解您的问题背后的意图,是因为您关注"服务器",并询问了它与直接硬盘写入相比的优势。因此,这里有几种合法数据库服务器的替代方案,并对它们进行了比较,这在您的场景中可能有意义。
CSV文件
CSV文件,或逗号分隔文件,基本上是直接存储在磁盘上的文本文件。在您的应用软件中,您可以使用典型的文件流访问这些文件。CSV文件被广泛使用,因此,每种语言和软件生态系统都有自己的库或与CSV文件接口的技术。CSV文件也可以使用简单的文本编辑器(如记事本)进行操作。许多工作表软件,如Microsoft Excel,OpenOffice或Google Sheets都能够处理和操作这些CSV文件,但是如果不特别小心使用这些工具,它们可能会损坏文件。使用CSV数据的缺点是,某些数据格式很难处理,很难维护关系数据或多个表,而且您永远无法从自行开发的CSV实现中获得与数据库相同的IO性能。此外,数据将仅可用于数据所在的计算机,而不会实现文件共享,这同样无法与经过数十年发展的适当数据库的网络性能相媲美。
工作表
类似于CSV文件,有相同的优点和缺点。但是它们使用特殊的格式,通常是专有的,并且很难(如果不是不可能的话)使用记事本修改。它们通常还需要某种外部库来使用自定义代码与它们接口。
SQLite
那么为什么要使用数据库呢?
MySQL、玛丽亚数据库、Mongo和MSSQL都是数据库服务器,允许您跨应用程序示例、跨用户和设备持久化数据。数据库服务器的真正好处是当您的应用程序有多个示例同时修改同一数据集时。如果您有多个用户同时访问同一个数据集,或者如果多个设备需要同时访问同一个数据集,则这一点就更有必要。如果这些听起来都不是您的需求的一部分,那么您可以自由选择数据库服务器的替代方案,如SQLite。
iqxoj9l93#
你不需要。
您可以使用与应用在同一进程中运行的SQLite,而无需服务器。
或者...您可以简单地将MySQL本地安装在您的机器上。
此外,如果您使用Java,则会有一些嵌入式数据库,如H2、Derby和HyperSQL,它们的行为与典型数据库类似,但实际上将所有数据存储在您选择的文件夹中的本地文件中。
H2甚至有一个"MySQL仿真模式",它实现了MySQL的常见SQL行为。
当然,让一个数据库在单独的服务器上运行允许多个用户连接到同一个数据库来执行单独的任务。但是,有时候只需要单个用户访问,就可以避免使用(和付费)一个服务器。
hjzp0vay4#
所有RDBMS都有一个“引擎”的概念,即实际解释查询并获取结果的组件。没有这个引擎,数据库只不过是存储器。这个引擎通常被称为“服务器”,它不一定需要在专用硬件上执行。尽管这样做通常是有利的。大多数RDBMS也有一个可以在本地运行的 Engine 版本,所以本质上如果你想查询你的数据,你总是需要这个引擎,即使它是以本地库或专用于您的进程的可执行文件的形式运行。
你可以为你的 * 数据库 * 使用一个文本文件,你根本不需要使用SQL,你可以序列化你的数据并将其保存在文本文件中,但是在你的应用生命周期内将其读入内存。但是当你这样做的时候,你就在自己的代码中承担了存储和管理数据的所有责任。
基于SQL的数据库的一个关键概念是ACID Principal,以及服务器能够对多个并发查询进行编组或排队,同时仍然维护ACID主体:原子性、一致性、隔离性和耐久性。大多数现代RDBMS已经发展到提供很好的性能,但是数据库查询的方式和频率不同于传统的基于文件的访问,这是计算机操作系统设计的目标。数据库需要大量的内存和CPU,并访问低延迟存储,以最大效率运行。
如果您的数据库只打算从一个独立设备上的单个程序访问,那么您可以轻松地使用所选RDBMS的 local 变体。我已经使用LocalDB和Express版本的MS SQL Server编写了许多应用程序。但在我们互联的世界中,许多应用程序可以从共享同一数据库的多个设备中获益。当这种情况发生时,您要么需要将其中一个设备专用于 * 作为服务器 *,并且可能需要永远保持开机状态,要么您可以在专用硬件或云中运行服务器。
企业级数据库引擎变体的另一个考虑因素是,为了获得更高的性能,它们需要在“更接近”“金属”的情况下操作,它们需要比许多“标准”工作站操作员所能授予的更高的安全特权和对文件系统的更低级别的访问。这会导致各种困境,包括谁可以安装和操作数据库。您甚至可以阻止防病毒软件扫描与数据库相关的文件,因为数据库可能需要独占访问这些文件,或者在许多情况下,它们的运行方式与常见病毒和恶意软件的配置文件非常相似。这对企业数据构成了重大的安全风险,因此,数据库引擎常常被托管在运行于特定安全上下文下的专用服务器上,在该特定安全上下文下,我们实际上根本不允许普通工作站用户登录到控制台。由于这些服务器可能易受攻击,因此通常部署防火墙以加固它们免受攻击并减少攻击面。
在本地工作站或设备上管理所有这些工作可能会非常困难。
数据库传统上是IO密集型的,如果没有足够的容量将所有内容加载到内存中,则必须使用文件系统。根据编程逻辑的其他要求,如果在执行程序的同一设备上运行数据库引擎,则可能没有足够的资源来运行数据库的“类型”并实现所需的“性能”。
如果您的应用永远不会发展到在多个设备上有多个访问点的地步,那么坚持使用本地RDBMS可能是合适的。但我们中的许多人对我们的软件都有宏伟的愿景,因此将数据库托管在既能支持我们希望的增长,又能根据需求进行扩展的资源上可能更有意义。
8yoxcaq75#
MySQL是一个客户端/服务器数据库。许多客户端应用程序可以本地或通过网络连接到MySQL服务器进程。实现此目的的一种方法是运行一个服务进程来管理它们对数据文件的访问。
如果没有服务进程,并且所有的客户机应用程序都试图直接读写数据文件,那么它们将频繁地发生冲突,并最终损坏数据。
另一种方法是让每个客户端应用程序都连接到数据文件,使用文件锁定请求锁定它(POSIX操作系统提供此功能),然后执行读或写操作,但这种方法的缺点是一次只有一个客户端可以使用数据库。
此外,文件锁定只能在本地工作,因此远程客户端很难通过网络使用数据库。有一些共享卷技术,如SMB或NFS,但这些技术不够快、可靠或同步,无法满足使用数据库的客户端应用程序的需求。
文件锁定策略是嵌入式数据库(如SQLite)如何共享对数据文件的访问,以允许多个客户端并发共享数据库。阅读https://www.sqlite.org/lockingv3.html的描述,您将了解以这种方式协调多个客户端是多么困难的任务。而且它仍然只适用于本地客户端。
如果将软件服务用作对数据文件具有直接读/写访问权限的单个进程,则该进程的代码负责避免冲突。它可以支持更大的并发性,因为每个客户机通常处理不同的数据子集。它可以在RAM中实现缓冲区以帮助加快数据访问速度。它可以实现ACID功能。它可以强制验证和授权控制。
因此,使用软件服务的优势包括:
MySQL曾经有一个名为
libmysqld
的特性,因此客户端应用程序可以将MySQL引擎作为一个直接链接到应用程序的库来运行,而无需运行MySQL服务器进程。它是deprecated in version 5.7 and removed from the 8.0 product。几乎没有MySQL用户使用这个特性,而且维护它是一个负担。它只是增加了MySQL下载包的大小,几乎没有任何价值。