2009-06-02 59 views

回答

2

[编辑]相信的问题是指甲骨文对象为OLE(OO40)/编辑]

对于这个例子,考虑顺序和LINE_ITEM之间的一对多的关系。 (一个订单可能有零个,一个或多个line_item,并且一个line_item只与一个订单关联)。我们跳过所有的建模步骤,并获得定义可能的外观。

一种选择是使用一个参考:

create type order_typ as object 
(id integer 
, ... 
); 

create table order_obj_table of order_type; 

create table line_item 
(order_ref ref order_typ scope is order_obj_table 
, ... 
); 

另一种替代方法为使用一个嵌套表(称为集合型):

create type line_item_typ as object 
(id integer 
, ... 
); 

create type line_item_collection_typ as table of line_item_typ; 

create type order_typ as object 
(id   integer 
, line_items line_item_collection_typ 
, ... 
); 

[编辑]

附件:

托尼安德鲁斯问(相当合理)为什么人们想要使用“嵌套表”。 Tony指出,由此产生的数据库结构将“难以访问”,他表示(我认为)所需的查询结构是“非标准”SQL。

非常坦率地说,我想不出一个好的理由,我会使用嵌套表,但我必须至少承认,OO4O确实提供了对嵌套表的支持。

为什么要选择使用OO4O呢?它通过本机驱动程序提供(表面上)针对Oracle数据库的改进性能,避免了由ODBC或OLE引起的开销。它也是专门针对Oracle的技术,针对OO4O界面编写应用程序意味着应用程序将基本上与Oracle数据库绑定,如果没有要求应用程序支持多个(可互换)的数据库引擎,则该应用程序可能没有问题。

更多信息和用于OO4O实例可从Oracle网站:

http://www.oracle.com/technology/tech/windows/ole/index.html

[/编辑]

+0

太棒了,但您可以使用第二个替代方案发送示例吗? – 2009-06-02 04:24:08

2

除非'Oracle Objects'是某种产品(大写字母有助于区分普通单词和产品名称),否则您的操作方法与您在其他任何DBMS中的操作方法相同。

对于1:n的关系:

CREATE TABLE Master 
(
    PK_Column <sometype> NOT NULL PRIMARY KEY, 
    ... 
); 
CREATE TABLE Detail 
(
    FK_Column <sometype> NOT NULL REFERENCES Master, 
    OtherColumn <anothertype> NOT NULL, 
    PRIMARY KEY (FK_Column, OtherColumn), 
    ... 
); 

对于n:M关系:

CREATE TABLE TableN 
(
    N_Identifier <sometype> NOT NULL PRIMARY KEY, 
    ... 
); 
CREATE TABLE TableM 
(
    M_Identifier <anothertype> NOT NULL PRIMARY KEY, 
    ... 
); 
CREATE TABLE CrossRef 
(
    N_Identifier <sometype> NOT NULL REFERENCES TableN, 
    M_Identifier <anothertype> NOT NULL REFERENCES TableM, 
    PRIMARY KEY (N_Identifier, M_Identifier), 
    ... 
); 

的SQL语法是或多或少DBMS中性(它应该劈出关闭SQL标准句法)。