oracle对象中的关系?

时间:2009-06-02 00:28:54

标签: oracle object

如何在oracle对象中创建关系1到n和n到n?

2 个答案:

答案 0 :(得分: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标准语法)。

答案 1 :(得分:2)

[编辑]我认为问题是指Oracle Objects for OLE(OO40)[/ EDIT]

对于此示例,请考虑order和line_item之间的一对多关系。 (一个订单可能有零个,一个或多个line_item,而line_item只与一个订单相关联。)我们跳过了所有的建模步骤,并获得了定义可能是什么样的shell。

一种选择是使用参考:

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 Andrews(非常合理地)问为什么要使用“嵌套表”。 Tony指出,生成的数据库结构将“难以访问”,他认为(我认为)所需的查询结构是“非标准”SQL。

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

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

有关OO4O的更多信息和示例,请访问Oracle网站:

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

<强> [/ EDIT]