近期做项目,遇到一个基站的数据模型,此基站有7大属性,每个属性下面又有第二层的若干个属性,第二层下面又有第三层的若干属性,一直到第五层的最底层属性超过1000个,现在要把这个基站按照7大属性,设计成7个表,每个属性的最底层属性从100到400多不等。
如何设计呢?
第一、最常见的用每个属性的最底层属性来建表,最大的一个表超过400个字段,这样从性能到维护都是不行的。
第二、按照事实表与纬度表的关系来设计,把每个大属性分为若个小属性来设计表,结果可能是得到几十个表,相互之间还有复杂的逻辑关系,在业务处理上不方便。
第三、按照Oracle面向对象的设计方法,以第三层为准设计对象,就是把每个大属性下面的第三层属性设计为每个对象,然后再用对象来定义表。
原数据模型太复杂了,就不举例了,下面用一个简单的例子来说明下。
例如常见的员工表,有这些字段(eid、ename、sex、borthady、address、phone、job、dept、manager、sal、subsidy、tax、school、grad、educa、degree、extcol、extcol2、extcol3、、、)
按照字段的类别设计为下面的几个类:
--员工基本类
create or replace type ty_person as object
(ename varchar2(20),--姓名
sex char(1), --性别
borthady date, --生日
address varchar2(20),--地址
phone varchar2(20) --电话
);
--工作基本类
create or replace type ty_job as object
(job varchar2(20), --职位
dept varchar2(20), --部门
manager varchar2(20) --经理
);
--工资基本类
create or replace type ty_sal as object
(sal number, --工资
subsidy number, --补贴
tax number --税费
);
--教育基本类
create or replace type ty_edu as object
(school varchar2(20), --毕业学校
grad date, --毕业时间
educa varchar2(20), -- 学历
degree varchar2(20) --学位
);
--使用上面的类来构造员工表
create table t_emp
(eid varchar2(20) not null,
person ty_person,
job ty_job,
sal ty_sal,
edu ty_edu,
extcol varchar2(50),
extcol2 varchar2(50),
extcol3 varchar2(50),
extcol4 varchar2(50),
extcol5 varchar2(50)
);
--extcol 表示扩展字段
下面介绍类的基本操作:
1.使用构造函数加入数据
insert into t_emp(eid , person,job,sal,edu ,extcol,extcol2,extcol3 ,extcol4,extcol5)
values('001',
ty_person('scott','M',to_date('1981-10-10','yyyy-mm-dd'),'beijing','0102345678'),
ty_job('DBA','IT','smith'),
ty_sal(8000,1000,500),
ty_edu('Peking University',to_date('2004-10-10','yyyy-mm-dd'),'bachelor','bachelor'),
null,null,null,null,null);
2.查询数据
select * from t_emp t;
--查某个类的数据
select t.person.name,t.person.sex,t.person.borthady,t.person.address,t.person.phone
from t_emp t;
3.删除数据
delete t_emp t where t.person.name='scott';
4.修改数据
update t_emp t set t.person.name='Mark'
where t.person.name='scott';
UPDATE t_emp e
SET e.person = ty_person('mark','M',to_date('1982-10-10','yyyy-mm-dd'),'neijing','0212345678')
WHERE e.eid = '001';
基本的操作就是这些,更多的面向对象操作请查看Oracle文档。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。