[20180309]不好的数据结构设计.txt

[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教育真的很成问题....

上一篇:安装报警防盗监控系统 提高安全意识


下一篇:差别隐私,iOS 10 更新升级的保护伞