首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle表结构

Oracle表结构
EN

Stack Overflow用户
提问于 2013-02-20 14:08:25
回答 1查看 565关注 0票数 0

我在Oracle数据库中有一个表,其中有60列。下面是表结构。

代码语言:javascript
复制
ID  NAME TIMESTAMP PROERTY1 ...... PROPERTY60  

这个表将有很多行。表的大小将以GB为单位。但是表结构的问题是,将来如果我必须添加一个新属性,我必须更改模式。为了避免这种情况,我想将表结构改为如下。

代码语言:javascript
复制
ID NAME TIMESTAMP PROPERTYNAME PROPERTYVALUE  

一个样例行将是。

代码语言:javascript
复制
1  xyz  40560 PROPERTY1 34500  

通过这种方式,我将能够解决问题,但表的大小将变得更大。在获取数据方面,它会对性能产生任何影响吗?我是甲骨文新手。我需要你在这方面的建议。

EN

回答 1

Stack Overflow用户

发布于 2013-02-20 22:23:56

如果必须添加新属性,则必须更改模式

这真的是一个问题吗?在较新版本的Oracle中,添加列已经获得了cheapermore convenient

但是,如果您仍然需要使您的系统动态,在某种意义上,您不必为新属性执行DDL,下面这个简单的EAV实现可能是一个很好的开始:

代码语言:javascript
复制
CREATE TABLE FOO (
    FOO_ID INT PRIMARY KEY
    -- Other fields...
);

CREATE TABLE FOO_PROPERTY (
    FOO_ID INT REFERENCES FOO (FOO_ID),
    NAME VARCHAR(50),
    VALUE VARCHAR(50) NOT NULL,
    CONSTRAINT FOO_PROPERTY_PK PRIMARY KEY (FOO_ID, NAME)
) ORGANIZATION INDEX;

注意ORGANIZATION INDEX:整个表只是一个大的B-树,根本没有表堆。属于同一FOO_ID的属性在物理上存储在一起,因此检索已知FOO_ID的所有属性的成本会很低(但不会像所有属性都在同一行时那么便宜)。

您可能还需要考虑是否适合:

  • 在FOO_PROPERTY中添加更多索引(例如,用于搜索属性名称或值)。只需注意在索引组织中的二级索引的额外成本-如果你主要是根据属性名称搜索,而很少检索给定BLOB的所有属性,这也会使FOO_ID可行,因为索引的前沿现在是相对较宽的字符串(与窄integer).
  • Use不同的值类型相反(例如,RAW,甚至in-line FOO_ID/ index compression,这可能会影响性能,但也可能提供额外的灵活性)。或者,您甚至可以为每个可能的值类型创建一个单独的表,而不是将string.
  • Separate属性“声明”中的所有内容都填充到它自己的表中。该表将有两个键:除了string NAME之外,它还将具有整数PROPERTY_ID,然后可以在FOO_PROPERTY中将其用作FK,而不是NAME (节省了一些存储空间,但代价是连接更多)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14973349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档