在本文中,我將分析(關係)資料庫中組織資料的不同方式,在本文的例子中,我採用oracle進行闡述,但其他關聯式資料庫面臨同樣的問題,這些關聯式資料庫組織資料的方式既有優點也有缺點,將給以區分,據此讀者可判定適合他們的需要資料組織方式。
採用何種資料組織方式,取決於業務需求和開發需要,各種儲存資料的方式可以實現。第一種組織資料的方式是橫向結構,這是傳統的資料儲存方式,每一新的資料記錄插入為一行,表中的列橫向組織(布局),正如其名。第二種組織資料的方式為縱向結構,這是縱向儲存資料的特定方式,表中僅包含兩個實際資料列,其中之一用於標識行(但可有更多的列),資料以鍵/值對(key/value pair)方式儲存,亦如其名。
縱向結構與橫向結構的比較
下面是傳統的橫向表結構的例子:
表 hr id
first_name
last_name
dept
***123
vlad
kofmanitm
234jim
cramer
marketing
m456
olimpia
dukakis
accountingf
下表為縱向表結構的例子:
表 vr id
keyvalue
123first_name
vlad
234first_name
jim456
first_name
olimpia
123last_name
kofman
234last_name
cramer
456last_name
dukakis
123dept
it234
dept
marketing
456dept
accounting
123***
m234
***m
456***f
正如所見,資料從 3行 x 4列 的矩陣(表hr)轉換為 12行 x 2列 的矩陣(表vr),好像縱向表的行數等於橫向表的記錄數乘以橫向表的列數,例如 3x4=12。然而,這種假設並不正確,將在下文中討論該問題。
縱向資料儲存的優點和缺點
基於預知的結構和列,以傳統的橫向結構儲存資料具有很多優點,但也存在缺點。加入有一應用表單,其表單完全是動態的,無具體的字段數量和名稱,使用者可能隨時建立一新的字段,並給定其名稱和值,如何將其持久化到資料庫中呢?
先假設另一不同的場景,其中表單基於業務需求建立,包含一些特定業務要求的字段,每一表單的資料儲存在橫向表中,其中每一字段插入一特定的列,每一表單儲存為一行,一月後,應用上線,業務需要一新的字段,在表單中加入新的字段,ui及其儲存邏輯需要調整,實際資料表也需要額外加入字段,應用也需要重新測試和部署。
i在開發人員無權直接訪問資料庫的環境中,dba要直接介入更改實際表(結構)。
那麼,若一月後需增加另一字段將如何呢?
上述兩種應用場景,縱向資料結構可應用於差異的動態應用邏輯層及ui。由於資料僅以key/value對的兩列儲存,通過唯一的id與邏輯表單關聯,對表單中字段的數量無限制;此外,縱向表結構下,一邏輯行可含有不同數量的字段,因此,縱向表結構的最大優點就是其可擴充套件性,但也存在很多缺點。
(蔥香結構表)具備了可擴充套件性,但失去了對資料的可控性,意味著正常資料極難維護。不屬於單錶的邏輯行可能儲存在一起,例如,縱向結構表中的mutual fund資訊可與分析師名稱和合同資訊混合,而正常情況下此類資訊應該儲存在另外的表中,而以其外來鍵id與fund關聯。
縱向結構表中也缺失資料型別。 因為列值僅有一類(例如 varchar),所有列值不僅需要型別,且在儲存和檢索時需要型別轉換,且在縱向結構表中不可能儲存特殊資料型別,諸如 blob 或 clob。
縱向結構表的另一缺點是資料的一致性。事實上,所有列名作為key列的資料,利於使用者(或應用)儲存不同的名為key的可能的標識資料。例如,某使用者可建立一新字段將其值「oracle」作為「company」儲存,但另一使用者可將「oracle」作為「organization」。
此外,操縱及應用縱向結構表也非常困難。為找到所需的邏輯行,需要許多自連線(self-join),因此,只有極少數的商業報表系統可工作於縱向表結構下並生成各類有意義的報表。
例如:從橫向表中獲取所有男性人員,select語句如下:
select * from hr where *** like 'm'要從縱向表中獲取同樣的資料,需要自連線(self-join),先獲取id(集合),然後獲取資料:
select * from vr where id in(select id from vr
where key = '***'
and value = 'm')
許多開發人員,編寫特定的資料庫函式或儲存過程來講縱向結構的資料轉換為橫向結構的資料,以便易於獲取報表或其它工作所需的資料。id
grouping
keyvalue
1231name
vlad
1231
phone
555-555-5555
1232
machine
dell 560
1232
ispverizon
2341
name
mariya
2341
phone
555-456-8392
2341
2432
machine
dell 1750
報表生成後,可輕易地基於「grouping」列分成不同的頁面(page)或片段(section)。因此,上述縱向錶可變成如下報表:
report 1
page 1
name
phone
vlad
555-555-5555
page 2
machine: dell 560
isp: verizon
report 2
page 1
name
phone
mariya
555-456-8392
page 2
machine: dell 1750
可注意到不同形式的報表和頁面其中資料的數目各不相同。結論
上文中,揭示了在資料庫表中持久化資料的不同方式,縱向結構所具有的優勢和擴充套件性常被其短處掩蔽。然其可擴充套件性,通常是設計資料結構的僅有方法。此外,橫向結構錶可很好適用於正常的資料,也是關係資料庫系統持久化資料的傳統方式。軟體及其資料庫架構師對於特定的應用需求將決定採用何種資料庫表的設計方式。
原文:
oracle 橫向列變為縱向列
很多業務需求儲存資料的時候都採取key value的形式,展示時則需要key1,key2,key3.展示 效果如下 sql語句如下 select round sum case when data item code backn52 then data item value else 0 end 2 ...
關於oracle中縱向記錄橫向顯示的問題舉例說明
最近在論壇裡經常看到有朋友問這個問題,下面列舉兩個真實問答例子來說明 一下 例一 表如下 id no name course score 1 001 趙 語文 80 2 001 趙 數學 40 3 001 趙 英語 60 4 002 李 語文 50 5 002 李 數學 30 6 003 唐 語文 ...
oracle 將查詢結果縱向橫向顯示。
使用max decode 函式可以將將查詢結果縱向橫向顯示 例如 表 dict 編號 lxbh 型別名稱 lxmc 101 變壓器 102 斷路器 103 電磁是電壓互感器 104 電容式電壓互感器顯示變壓器 斷路器 電磁是電壓互感器 電容式電壓互感器101 102 103 104select ma...