Oracle对象的使用范围有多广?

时间:2011-04-23 21:54:57

标签: oracle user-defined-types

我正在为数据库类编写一个赋值,我们需要将现有的关系模式迁移到Oracle对象。这整个崩溃让我感到疑惑,这些东西有多广泛使用?数据模型很糟糕,语法很糟糕,而且面向对象只占实现方式的四分之三左右。

有没有人使用这个?

8 个答案:

答案 0 :(得分:13)

对于初学者,一些标准的Oracle功能使用Types,例如XMLDB和Spatial(包括声明嵌套表数据类型的列)。

此外,许多PL / SQL开发人员一直使用类型来声明PL / SQL集合或流水线函数。

但我同意很少有地方广泛使用类型并从中构建PL / SQL API。这有几个原因。

  1. Oracle非常缓慢地实现了对象。尽管它们是在8.0版本中引入的,但直到9.2它们才完全支持继承,多态和用户定义的构造函数。没有这些功能,正确的面向对象编程是不可能的。直到版本11g我们才得到SUPER()。即使是现在也缺少一些功能,最明显的是TYPE BODY中的私人声明。
  2. 语法经常笨拙或令人沮丧地模糊不清。文档没有帮助。
  3. 大多数与Oracle合作的人往往来自关系/程序学院的编程。这意味着他们往往不了解OOP,或者他们无法理解在数据库编程中它有用的地方。即使人们提出了一个简洁的想法,他们发现很难或不可能使用Oracle的语法实现。
  4. 最后一点是关键点。我们可以学习新语法,我们可以说服Oracle完成功能集,但只有我们能够为类型提供用途才有用。这意味着我们需要使用继承和多态来解决的问题。

    我曾经在一个广泛使用类型的系统上工作过。它是一个数据仓库系统,数据加载子系统是由类型构建的。基本原理很简单:

    • 我们需要为我们加载的每个表应用相同的业务规则模板,因此该过程是通用的;
    • 每个表都有自己的投影,因此每个表的SQL语句都是唯一的。

    Type实现是干净的:通用过程在Type中定义;每个表的实现都在一个继承自该泛型Type的Type中定义。可以从元数据生成特定类型。几年前我在UKOUG上介绍了这个主题,我在博客上更详细地写了这篇文章。Find out more.

    顺便说一句,关系理论包括域的概念,它是用户定义的数据类型,包括约束等.RDBMS的任何风格实际上都不支持域,但Oracle的类型实现绝对是一步。

答案 1 :(得分:10)

我从来没有见过它的好处,主要是因为当我上次检查它时,你的对象定义一旦被桌子使用就不可变了。

因此,如果你有一个在Customer表定义中使用的Address对象,那么你永远不会在不删除Customer表的情况下更改Address对象定义,或者不必经历非常糟糕的转换。

对象适用于数据实例化 - 就像应用程序所做的那样 - 但是对于数据存储和基于集合的操作,我只是看不到重点。

答案 2 :(得分:7)

许多其他答案都给出了使用对象确实有意义的好例子;通常,这些是处理某些特定的,可能是复杂的数据类型。 Oracle本身将它们用于地理空间数据。

什么是常见的,除了在一些大学课程中遗憾地出现,是使用基于对象的表而不是常规的关系表来保存像员工和部门这样的常规数据:

create type emp_t as object (empno number, ename varchar2(10), ...);
create table emp of emp_t;

虽然这些可能是教授这些概念的简单例子,但我担心它们可能会导致新一代数据库开发人员认为这种方法更合适,更现代,因此比“老式”关系表更好。它着重不是。

答案 3 :(得分:5)

我只听说过它被用在一个地方,所涉及的开发人员正在转而远离它。我曾经考虑过纯粹在PL / SQL中使用它,但是因为我们的DBA不会让我们安装任何类型,因为担心我们可能会在表中使用它们,这种情况不太可能发生。

分享并享受。

答案 4 :(得分:3)

看到他们在你的系统中的某个地方扮演角色并不常见。例如,如果您正在使用Oracle数据盒式磁带。有时,当你需要做一些非常奇怪的事情时,他们是必要的。

在系统中广泛使用它们并不常见。我已经看到两个不同的系统使用了很多对象,这两次都是一场灾难:难以使用,速度很慢,而且充满了bug。

使用基本表,行和列的“简单”关系方法几乎总是足够好。每个程序员(和程序)都可以理解这些概念,并且它们对于几乎任何任务都足够强大。然而,您可以花费很多年时间来完全理解和优化这些方法。对象关系技术在此基础上增加了大量的复杂性,但收效甚微。

答案 5 :(得分:3)

我使用了带有构造函数的简单类型和一些方法来包装一些与现有tcp服务器交互的功能。我需要传递x个字节(原始对象)并接收回x个字节(干净的对象)。我本可以写一些特定于我的任务的程序,但使用对象类型允许这对其他人来说更通用。没有什么花哨的,非常基本的OO东西,创建原始对象,填充其100个左右的属性,调用其清理函数,并将结果分配给新的“干净”对象。任何想要调用tcp服务器的人都可以遵循相同的基本步骤,只使用他们的数据填充任何原始值。

但是,根据我的经验,我不会说Oracle是面向对象的,而是具有对象的一些基本功能。正如其他人所说,公司不会因为OO功能而购买Oracle。不要太过于陷入Oracle imo。

答案 6 :(得分:2)

我不得不说这不是人们购买甲骨文的原因。它非常不便携/非标准,正如亚当指出的那样也有一些使用上的缺陷。我个人没有看到它的好处。我不知道它的使用范围有多广泛,但我无法想象这是非常大的。浏览一下这个网站,看看有多少问题。这可能会给你一些见解。

答案 7 :(得分:1)

从来没有在我的练习中使用过它们,从来没有听过任何人使用它们,没有广泛使用我猜,当你有一个面向对象的数据库,oracle支持OO但不是OO数据库时很重要。我认为从OO数据库迁移到Oracle的人会广泛使用它们