我在Oracle数据库中有一个表,其中有60列。下面是表结构。
ID NAME TIMESTAMP PROERTY1 ...... PROPERTY60 这个表将有很多行。表的大小将以GB为单位。但是表结构的问题是,将来如果我必须添加一个新属性,我必须更改模式。为了避免这种情况,我想将表结构改为如下。
ID NAME TIMESTAMP PROPERTYNAME PROPERTYVALUE 一个样例行将是。
1 xyz 40560 PROPERTY1 34500 通过这种方式,我将能够解决问题,但表的大小将变得更大。在获取数据方面,它会对性能产生任何影响吗?我是甲骨文新手。我需要你在这方面的建议。
发布于 2013-02-20 22:23:56
如果必须添加新属性,则必须更改模式
这真的是一个问题吗?在较新版本的Oracle中,添加列已经获得了cheaper和more convenient。
但是,如果您仍然需要使您的系统动态,在某种意义上,您不必为新属性执行DDL,下面这个简单的EAV实现可能是一个很好的开始:
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的所有属性的成本会很低(但不会像所有属性都在同一行时那么便宜)。
您可能还需要考虑是否适合:
https://stackoverflow.com/questions/14973349
复制相似问题