我不是来自CS /软件工程背景的人,但是最近我开始对使用Python进行Flask Web开发进行自我研究。
我目前正在“数据库”主题上,并且在Internet上对该主题进行进一步研究后,我遇到了一些术语,包括数据库,DBMS,数据库引擎和存储引擎。互联网上的不同来源似乎对上述内容给出了不同的定义。
从互联网和Miguel Grinberg的网络开发书中,这是我很困惑的一些观点:
在Miguel的Grinberg书中,作者似乎在推断数据库引擎= DBMS =软件应用程序,例如MySQL,SQLite,Postgres等。
资料来源:Miguel Grinberg在数据库一章下的书的第53页
在Wikipedia中,数据库引擎(或Wikipedia中所述的存储引擎)被提及为软件应用程序,例如InnoDB,MyISAM,Aria等。
链接:https://en.wikipedia.org/wiki/Database_engine
在Quora中,一位评论员(Stephen Kinght)说DBMS和数据库引擎是两个不同的实体,因此数据库引擎只是DBMS中负责管理数据库的组件的一部分。
链接:https://www.quora.com/What-are-some-database-storage-engines
因此,基于以上三点,我想到的问题如下:
DBMS是数据库引擎/存储引擎= MySQL,SQLite,Postgres等软件应用程序吗?
或
DBMS!=数据库引擎/存储引擎吗? (其中DBMS = MySQL,SQLite,Postgres和数据库引擎/存储引擎分别是InnoDB,Aria,MyISAM等?)
如果有人可以帮助我消除对此术语的疑问,我非常感谢。我曾尝试在Internet上进行研究,也尝试过Stack Overflow中的帖子,但我仍然无法真正理解这个概念。
谢谢!
答案 0 :(得分:5)
DBMS必须始终包括存储引擎才能发挥作用。这是专门设计用于仅在关闭时丢失所有数据的内存中系统的模数(出于这个原因,首先将它们称为“ DBMS”可能会引起质疑)。
但是,DBMS对用户的作用远不只是存储引擎。例如。 DBMS还对用户在数据库更新期间提供的数据执行完整性检查。
DBMS代表数据库管理系统,它清楚地表明它是用于管理数据库(有组织的数据集合)的软件(/引擎)。
因此,按照常规知识,您将拥有DBMS =数据库引擎= IMS / IDMS / DB2 / PostgreSQL / ...,而存储引擎= DBMS使用的存储组件,通常是专有的,实际上未命名,但并非总是如此,一些“命名”存储引擎MyISAM,InnoDB,Microsoft Jet,BerkeleyDB(???)以及其他一些存储引擎。
不幸的是,行业中的绝大多数数据库从业者都犯有交替使用,草率地和错误地使用这些术语的罪名,从而导致/造成/使引起您提出这个问题的困惑一直存在。您已被警告:-)
答案 1 :(得分:1)
我认为DBMS是指整个软件产品-PostgreSQL,Oracle,DB2等。
这些是大型,复杂的产品。与复杂软件一样,它们通常分为多个组件,每个组件都有自己的特定功能,并且它们之间具有定义明确的接口。一个组件将处理验证和解析SQL。一个人会照顾记忆;另一个将处理IO,依此类推。我猜这最后一个-IO之一-通常被称为存储引擎,因为它“驱动”磁盘上的数据。任何人都将其为何称为引擎而不是组件或子系统的原因。
这些名称没有ISO标准。因此,任何供应商,学者或博客作者都可以自由使用,重用和定义其认为合适的术语。
某些DBMS允许使用各种IO组件,每个组件都实现不同的技术。 MySQL具有InnoDB和MyISAM。 MongoDB具有WiredTiger和MMap。如果数据在“普通”表,内存表或具有列存储索引中,则SQL Server具有不同的磁盘格式和后台算法。如果这是作者选择使用的术语,则可以将它们视为不同的存储引擎。
由于DBMS的基本目的是存储和检索数据,因此很容易看到存储部分如何成为整个产品的同义词。从这个角度来看,其他组件被视为辅助存储。也许这曾经是真的。在支持复杂身份验证,多模型API和仅内存的现代系统中,我认为这不再是可辩护的。