近期作項目,遇到一個基站的數據模型,此基站有7大屬性,每一個屬性下面又有第二層的若干個屬性,第二層下面又有第三層的若干屬性,一直到第五層的最底層屬性超過1000個,如今要把這個基站按照7大屬性,設計成7個表,每一個屬性的最底層屬性從100到400多不等。ide
如何設計呢?函數
第1、最多見的用每一個屬性的最底層屬性來建表,最大的一個表超過400個字段,這樣從性能到維護都是不行的。性能
第2、按照事實表與緯度表的關係來設計,把每一個大屬性分爲若個小屬性來設計表,結果多是獲得幾十個表,相互之間還有複雜的邏輯關係,在業務處理上不方便。spa
第3、按照Oracle面向對象的設計方法,以第三層爲準設計對象,就是把每一個大屬性下面的第三層屬性設計爲每一個對象,而後再用對象來定義表。設計
原數據模型太複雜了,就不舉例了,下面用一個簡單的例子來講明下。對象
例如常見的員工表,有這些字段(eid、ename、sex、borthady、address、phone、job、dept、manager、sal、subsidy、tax、school、grad、educa、degree、extcol、extcol二、extcol三、、、)文檔
按照字段的類別設計爲下面的幾個類:it
--員工基本類table
create or replace type ty_person as objectclass
(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文檔。