使用面向对象数据库或关系型数据库进行常规Web开发(包括大量的CRUD)的优缺点是什么?
更新:我重新打开奖励以将其授予Neville。
使用面向对象数据库或关系型数据库进行常规Web开发(包括大量的CRUD)的优缺点是什么?
更新:我重新打开奖励以将其授予Neville。
面向对象数据库(OODBMS)的概念相当破碎,过去几十年出现的各种商业和免费产品在市场上几乎没有占据什么优势。
相比于对象模型,关系模型在您对数据提出的问题种类方面更为强大。不幸的是,SQL抛弃了关系模型所能表达的大部分表达能力,但即使是这种被稀释的形式,在SQL中表达查询仍然比典型的OO数据库(无论是ORM还是OODBMS)更容易。
OODBMS中的查询主要由导航操作驱动,这意味着如果您的销售数据库具有销售人员拥有自己的销售记录,则查询给定SKU的月度销售情况不仅可能速度非常慢,而且非常难以表达。同时考虑授予员工访问建筑物的安全模型。哪种方式是正确的?员工是否应持有他们可以访问的建筑物集合,还是建筑物是否应持有能够访问它们的员工集合?更重要的是,为什么任何一个类都必须将另一个类的集合嵌入设计中?而且,无论你选择哪个,你如何询问有哪些员工对可以共同访问多个建筑物?没有直接的导航模式可以回答这样一个问题。明智的解决方案——"访问"对象——本质上是回归到一个经过适当规范化的关系模式,并且需要某种查询语言,该查询语言在很大程度上从关系代数中借鉴,以便在不进行大量数据传输的情况下回答该问题。
另外,考虑到面向对象数据库(OODBMS)所宣传的另一个主要优势:方法,尤其是带有虚拟方法的继承。例如,一个运动诊所可能会为不同类型的运动员设定不同的受伤风险指标。在ORM世界中,这将自动表示为一个类层次结构,以为根,并由每个派生类实现一个虚拟方法。问题在于,这种方法通常在客户端上实现,而不是在后端实现,因此,如果您想找出诊所所有运动项目中最高风险的10名运动员,唯一的方法是通过网络获取所有运动员,并将它们通过客户端优先级队列传递。我对OODBMS的了解不如SQL丰富,但我认为同样存在这个问题,因为存储引擎通常只存储足够的数据以在客户端编程语言中重新生成对象。在关系型模型或SQL中,您可以将受伤风险评分表示为视图,该视图可以简单地是每个运动员类型视图的联合。然后,您只需提出问题。或者你可以问更复杂的问题,比如“谁的伤病风险最大,自上个月检查以来增长最快?”或者“哪个风险评分已被证明是过去一年中最好的受伤预测器?”最重要的是,这些问题都可以在DBMS内回答,只需问题和答案通过网络传输。值得一提的是,关系型模型的出现是为了应对当时现有网络和分层式数据库管理系统的灾难状况,并且大部分情况下(基本上是正确的),取代了它们,除了少数应用领域以外(即使这些领域也可能仍然存在是因为SQL未能发挥关系模型的全部威力)。令人深感讽刺的是,现在很多行业基本上正在渴望回到“好旧时光”的网络理论数据库,这本质上就是面向对象数据库管理系统(OODBMSs)和当前NoSQL数据库在回归的方向。这些努力当然批评SQL未能满足当今需求,但不幸的是,他们错误地假定SQL是关系模型的高保真表达,可能是出于纯粹的无知。因此,他们甚至没有考虑关系模型本身,而这个模型几乎没有任何限制,这些限制已经迫使许多人离开SQL,转向OODBMSs。
关系型数据库:
优点:
缺点:
面向对象数据库管理系统(OOBDMS)
优点:
缺点:
# 'Persistent' allows us to save things transparently
class Car(Persistent):
def set_wheels(number)
self.wheels = number
# 'database' is a ZODB database
database.car = Car()
database.car.set_wheels(3)
database.car.colour = "yellow"
database.car.owner = "Trotter"
database.car.neighbour = Car()
因此,这取决于您所说的“常规Web开发”的含义。许多网站实际上不需要复杂的多维查询,并且按线性时间进行搜索根本没有问题。在这些情况下,使用关系数据库管理系统会在我看来过于复杂化您的代码。我使用纯对象数据库编写了许多CMS类型的应用程序。大量的CRUD并不特别涉及它;ZODB非常成熟,并且缓存和扩展性也相当不错。
但是,如果您正在编写需要执行类似于Google Analytics的复杂业务报告或某种具有数千兆字节数据的仓库库存管理系统的Web应用程序,则几乎肯定需要关系数据库管理系统。
总之,对象数据库可以为您提供可读性和可维护性,代价是复杂查询性能。当然,可读性是一个主观问题,而且不能忽视很多更多的开发人员知道SQL而不是各种对象数据库方言的事实。
关系型数据库
缺点
对象数据库
缺点
对象-关系数据库(您可能已经看到了UDT!)
不同的应用程序可能需要不同的方法(OO、关系型数据库或OODB)
参考文献
比较
http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems
http://en.wikipedia.org/wiki/Comparison_of_object_database_management_systems
http://en.wikipedia.org/wiki/Comparison_of_object-relational_database_management_systems
我认为一切都取决于你的问题的具体情况。(我知道这很冒险。)
我们所知道的是,你想要在Web开发中使用数据库,并且你将对数据进行大量操作。
其中一个相关的问题是,DB与你操作的对象紧密集成有多重要?如果非常重要,那么面向对象的DB就更推荐了。
另一方面,如果你的数据很容易适应关系模型,那么关系型数据库可能更好。
考虑一下你需要做的操作。你是否需要分析各种具有不同属性的项目?你需要多少来未雨绸缪你的数据库?
我应该补充说,如果你的数据库可能相当小,性能不会是一个主要问题。但是,如果性能确实是一个问题,除了面向对象与关系型数据库之外,你还有很多事情需要担心。(只是从关系型数据库世界中挑选一个例子,你应该使用什么规范化形式?这是一个非常重要且复杂的问题。你是在维护操作系统还是数据仓库?你是否提前知道某些查询非常重要或者可以忽略?等等。)
除了数据库性能和与对象模型的集成之外,还有其他现实世界中需要考虑的问题。您是否有磁盘空间/服务器/带宽限制?您是否只向Web用户提供少量操作,或者可能会有您甚至不认识的人创建自己的查询/编辑?
对于其他更重要的现实世界中的问题,您将与谁合作?他们已经知道什么(或偏好)?如果您还没有领域知识,也许您个人的好奇心会推动您朝一个方向前进?如果您正在开始一个个人项目,遵循自己的喜好比在开始之前担心性能更好地指导成功。
如果您可以回答这些类似的问题,即使答案是“我不知道”,您也将能够获得更好的指导方向。
这基本上解释了利弊: