[20180312]不好的資料結構設計3.txt

lfree發表於2018-03-12

[20180312]不好的資料結構設計3.txt

--//上個星期提到一種不好的資料結構設計.今天在提到一種:
--//就是本來一行儲存的資訊,變成豎著儲存,涉及一些安全資訊,透過例子來說明:

1.環境:

SCOTT@book> @ &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

2.例子:
SCOTT@book> @ &r/desc emp
           Name       Null?    Type
           ---------- -------- ----------------------------
    1      EMPNO      NOT NULL NUMBER(4)
    2      ENAME               VARCHAR2(10)
    3      JOB                 VARCHAR2(9)
    4      MGR                 NUMBER(4)
    5      HIREDATE            DATE
    6      SAL                 NUMBER(7,2)
    7      COMM                NUMBER(7,2)
    8      DEPTNO              NUMBER(2)

--//使用UNPIVOT
SELECT empno, column_name, VALUE
  FROM emp t UNPIVOT (VALUE FOR COLUMN_NAME IN (ename, job, TO_CHAR(mgr) ))
  where empno=7369;
                                                                   *
ERROR at line 2:
ORA-00917: missing comma

--//報錯,因為型別不一致.

WITH a
     AS (SELECT EMPNO
               ,ENAME
               ,JOB
               ,TO_CHAR (MGR) mgr
               ,TO_CHAR (HIREDATE, 'yyyy-mm-dd hh24:mi:ss') hiredate
               ,TO_CHAR (SAL) sal
               ,TO_CHAR (COMM) comm
               ,TO_CHAR (DEPTNO) deptno
           FROM emp
          WHERE empno = 7369)
SELECT empno, column_name, VALUE
  FROM a t UNPIVOT (VALUE
           FOR COLUMN_NAME
           IN (ename, job, Mgr, hiredate, sal, comm, deptno));

EMPNO COLUMN_NAME VALUE
----- ----------- -------------------
7369 ENAME       SMITH
7369 JOB         CLERK
7369 MGR         7902
7369 HIREDATE    1980-12-17 00:00:00
7369 SAL         800
7369 DEPTNO      20
6 rows selected.

--//資訊按照以上顯示格式來儲存,真不知道開發如何思考,這樣設計將原來多表的資料變成1個表.
--//還導致另外一個問題,就是value只能選擇字元型別來統一儲存.
--//得到的所謂好處就是欄位可以無限增加...

--//這樣還導致的結果如何統計分析,哎,圍繞這樣表結構如何查詢比如deptno=10,sal>=1000的那些記錄.
--//我曾經在itpub問過這樣表結構設計,才想起來在tom的<Oracle高效設計>書中提到這樣的設計.
--//討論連結:http://www.itpub.net/thread-1849887-1-1.html

--//這種設計叫EAV(Entity–attribute–value model).在連結
--//.
--//總之這種設計有許多限制,不能亂用.至少我沒看到這樣設計的先進性.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2151736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章