Web开发 - 对象数据库与关系数据库

ebb*_*ebb 11 database relational-database object-oriented-database

对于涉及大量CRUD的常规Web开发,使用对象数据库或关系数据库的缺点和优点是什么?

更新:我重新给予赏金奖励以给予内维尔.

Mar*_*tos 19

OODBMS的概念已经相当破碎,过去几十年中出现的各种商业和免费产品几乎没有在市场上产生过.

关于您可以询问数据的问题种类,关系模型比对象模型更强大.不幸的是,SQL抛弃了关系模型能够提供的大部分表达能力,但即使在这种稀释形式中,在SQL中表达查询仍然比在典型的OO数据库(无论是ORM还是OODBMS)中表达更容易.

OODBMS中的查询主要由导航操作员驱动,这意味着如果您的销售数据库有销售人员拥有他们的销售,那么查询给定SKU的月销售额不仅可能非常缓慢,而且非常难以表达.还要考虑一种允许员工访问建筑物的安全模型.表达这个的正确方法是什么?员工是否应该拥有他们可以访问的建筑物集合,或者建筑物是否应该拥有可以访问它们的员工集合?更重要的是,为什么任何一个班级必须将另一个集合纳入其设计中?而且,无论您选择哪一个,您会如何询问哪一对员工拥有多个可以共同访问的建筑?没有直接的导航模式可以回答这样的问题.明智的解决方案 - 一个"访问"对象 - 本质上是一个回归到正确规范化的关系模式,它需要某种类型的查询语言,它从关系代数中大量借用,以便在没有大量过量的情况下回答问题.有线数据传输.

还要考虑OODBMS吹捧的另一个主要优势:方法,尤其是虚拟方法的继承.对于不同类型的运动员,运动诊所可能具有不同的伤害风险指标.在ORM世界中,这将自动表示为类层次结构(Athlete在根处)和虚拟方法(int InjuryRiskScore()由每个派生类实现).问题是这种方法总是在客户端实施,而不是在后端实施,所以如果你想在你诊所的所有运动中找到10名风险最高的运动员,唯一的办法就是把所有运动员都带到连接并通过客户端优先级队列传递它们.我也不知道OODBMS世界,但我认为会出现同样的问题,因为存储引擎通常只存储足够的数据来重新水化客户端编程语言中的对象.在关系模型或SQL中,您可以将伤害风险评分表达为一种观点,这可能只是每运动员类型观点的结合.然后,你问问题.或者你可以提出更复杂的问题,比如"自上个月检查以来谁的伤害风险增加最多?" 甚至,"哪一个风险评分被证明是去年伤害的最佳预测指标?".最重要的是,这些问题都可以在DBMS内部得到解决,只需回答问题和答案.

关系模型允许DBMS基于谓词逻辑以高度提炼的方式表达知识,这允许您在其中存储的事实的各个维度被连接,投影,过滤,分组,汇总,以及以完全特别的方式重新排列.方式.它允许您以最初设计系统时未预料到的方式轻松烹饪数据.因此,关系模型允许我们所知道的最纯粹的知识表达.简而言之,关系模型拥有纯粹的事实 - 仅此而已,而不是更少(当然也不是对象或其代理).


从历史的角度来看,关系模型的出现是为了应对当时现有的网络和分层DBMS的灾难性事态,并且大部分(并且正确地)取代了所有应用领域的小范围(甚至可能是这些)仍然很大程度上是因为SQL无法提供RM的功能).具有讽刺意味的是,该行业的许多人现在基本上都渴望网络理论数据库的"美好时光",这本质上是OODBMS和当前NoSQL数据库的回归.这些努力正确地批评了SQL无法满足当今的需求,但不幸的是,他们认为(错误的,可能是出于纯粹的无知)SQL是关系模型的高保真表达.因此,他们忽视了,甚至考虑自身的关系模型,它具有几乎没有已经推动很多远离SQL,经常向OODBMSs限制.

  • 很明显你从未使用过宝石.你的论点都没有任何意义 (2认同)
  • @Stephan:1)你知道SQL和关系模型/代数之间的区别吗?2)你需要更具体;我引用的问题很容易用 SQL 表达。3)我不明白集合比有序集合的可扩展性更差的说法;强加的排序使优化者变得更困难,而不是更容易。我在 Microsoft 为分布式系统开发了一种查询语言,该语言在全扫描即席查询上的处理速度约为 1 TB/分钟;没有订购限制对于实现这一目标至关重要。4)关系模型对类型没有限制;SQL 确实如此。 (2认同)

Nev*_*uyt 14

关系型数据库:

优点:

  • 成熟的技术 - 许多工具,开发人员,资源
  • 广泛的开源和商业产品
  • 已知可扩展到非常大的站点,并且吞吐量非常高
  • 以逻辑和"可编程"方式表达许多问题域
  • 相当标准的语言(SQL)

缺点:

  • 阻抗与OO概念不匹配 - 在数据库中建模"继承"并不自然
  • 分层结构通常需要特定于供应商的语言扩展
  • 非关系数据(例如文档)不是天生的选择
  • 一旦定义了模式,业务域中的更改就很难实现

OOBDMS

优点:

  • 更接近OO概念
  • 从理论上讲,开发人员只需要使用一种语言 - 持久性细节就会被抽象掉.这应该提高生产力

缺点:

  • 可用的工具/资源/开发人员明显减少.
  • 没有广泛接受的标准
  • "黑盒子"持久化方法可能会使性能调整变得困难
  • 持久性细节经常泄漏到OO设计中(参见Marcelo的例子)