[20180309]不好的数据结构设计.txt
--//昨天检查生产系统,看到一个表段增长很快.仔细检查发现是正常的,但是表结构设计存在问题.
1.环境:
xxxxx> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
xxxxx> @ &r/desc XXXXXX_YYY.MS_RECIPE_SIGN
Name Null? Type
------------------------------- -------- ----------------------------
1 CFSB NOT NULL NUMBER(18)
2 RECIPE_CAKEY VARCHAR2(2000)
3 RECIPE_CFCA VARCHAR2(3000)
4 PHARMACY_PYR_CAKEY VARCHAR2(2000)
5 PHARMACY_PYR_CFCA VARCHAR2(3000)
6 PHARMACY_FYR_CAKEY VARCHAR2(2000)
7 PHARMACY_FYR_CFCA VARCHAR2(3000)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8 RECIPE_CFCA_TSS VARCHAR2(3000)
9 RECIPE_CFYW VARCHAR2(2000)
10 PHARMACY_PYR_CFCA_TSS VARCHAR2(3000)
11 PHARMACY_PYR_CFYW VARCHAR2(2000)
12 PHARMACY_FYR_CFCA_TSS VARCHAR2(3000)
13 PHARMACY_FYR_CFYW VARCHAR2(2000)
--//下划线的字段估计应该是最近增加的.
xxxxx> select * from dba_objects where object_name='MS_RECIPE_SIGN';
OWNER OBJECT_NAME SUBOBJECT_ OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
------ -------------------- ---------- ---------- -------------- ------------------- ------------------- ------------------- ------------------- ------- - - - ---------- ------------------------------
PORTAL MS_RECIPE_SIGN 108097 108097 TABLE 2015-07-22 09:51:42 2017-11-14 09:09:14 2017-11-14:09:09:15 VALID N N N 1
--//很明显2017-11-14 09:09:14修改了数据结构,增加6个字段.
xxxxx> select * from DBA_COL_COMMENTS where table_name='MS_RECIPE_SIGN' and comments is not null;
OWNER TABLE_NAME COLUMN_NAME COMMENTS
---------- ---------------- ---------------------- -------------------
XXXXXX_YYY MS_RECIPE_SIGN RECIPE_CFCA_TSS 处方时间 戳签名值
XXXXXX_YYY MS_RECIPE_SIGN RECIPE_CFYW 处方原文
XXXXXX_YYY MS_RECIPE_SIGN PHARMACY_PYR_CFCA_TSS 配药人时间戳签名值
XXXXXX_YYY MS_RECIPE_SIGN PHARMACY_PYR_CFYW 配药人 处方原文
XXXXXX_YYY MS_RECIPE_SIGN PHARMACY_FYR_CFCA_TSS 发药人时间戳签名值
XXXXXX_YYY MS_RECIPE_SIGN PHARMACY_FYR_CFYW 发药人 处方原文
6 rows selected.
--//注:有6个字段有说明,也说明是最近一段时间增加的.因为以前不要求开发增加字段说明,我多次强调,许多开发以后根本不知道这些字段的含义.
--//特别是一些表示状态的字段.更滑稽可笑我要求尽量完善字段的说明时,领导给我的建议遇到不懂的时候问开发,无语,我每天没事看,天天问人家
--//那个字段表示什么意思吗?再说,许多情况下开发根本不清楚,而且我曾经提交文档,仅仅需要知道经常access的表,已经缩小了范围.
--//一个处方,经历N多人的签名认证,才有效.
2.应该这样设计:
MS_RECIPE_SIGN 修改如下:
CFSB NOT NULL NUMBER(18)
CA_TYPE NOT NULL VARHCAR2(1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RECIPE_CAKEY VARCHAR2(2000)
RECIPE_CFCA VARCHAR2(3000)
--//增加1个字段CA_TYPE. 说明是CAKEY类型: 比如'1' 表示 RECIPE, '2' 表示 PHARMACY_PYR , '3' 表示 PHARMACY_FYR.
--//再增加一个表MS_RECIPE_TSS.
MS_RECIPE_TSS表结构设计如下:
CFSB NOT NULL NUMBER(18)
TSS_TYPE NOT NULL VARCHAR2(1)
RECIPE_CFCA_TSS VARCHAR2(3000)
RECIPE_CFYW VARCHAR2(2000)
--//TSS_TYPE ,说明TSS的类型. 比如'1' 表示 RECIPE_CFCA, '2' 表示 PHARMACY_PYR_CFCA, '3' 表示 PHARMACY_FYR_CFCA.
--//变原来的插入后不断修改为不断的插入操作,避免大量的行链接以及行迁移.而且还可以把这些表放入单独的32K表空间.节约磁盘空间.
--//可惜,一旦这样设计修改许多困难,真不知道开发关系数据库如何学的.连最基础的东西都没学好,写什么狗屁程序....
--//更大的问题,许多表结构都像上面那样设计,无语啊无语....
--//国内的IT教育真的很成问题....