亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

用于具有多個(gè)架構(gòu)的表的數(shù)據(jù)庫存儲(chǔ)的方法

文檔序號(hào):6352159閱讀:205來源:國(guó)知局
專利名稱:用于具有多個(gè)架構(gòu)的表的數(shù)據(jù)庫存儲(chǔ)的方法
技術(shù)領(lǐng)域
本發(fā)明涉及在數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的方法,并且更具體地涉及在數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù) 的方法,其中數(shù)據(jù)庫中的表與多個(gè)架構(gòu)(schema)相關(guān)聯(lián),多個(gè)架構(gòu)定義與表相關(guān)聯(lián)的相應(yīng) 的字段集合。
背景技術(shù)
許多現(xiàn)代應(yīng)用要求存儲(chǔ)大量數(shù)據(jù)。一般來說,數(shù)據(jù)被存儲(chǔ)在一個(gè)或多個(gè)結(jié)構(gòu)化的 數(shù)據(jù)匯集中,一個(gè)或多個(gè)結(jié)構(gòu)化的數(shù)據(jù)匯集被統(tǒng)稱為數(shù)據(jù)庫。為了管理存儲(chǔ)在現(xiàn)代數(shù)據(jù)庫 中的大批數(shù)據(jù),使用數(shù)據(jù)庫管理系統(tǒng)來促進(jìn)數(shù)據(jù)庫的創(chuàng)建和維護(hù)是常見的。
常見的數(shù)據(jù)庫類型是關(guān)系數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫將數(shù)據(jù)表示為關(guān)系的匯集。每個(gè)關(guān) 系包括多個(gè)元組,每個(gè)元組為共同的屬性提供值。通過組織成行和列的表來邏輯地表示關(guān) 系。表的每行表示關(guān)系的元組以及每列表示那個(gè)關(guān)系的屬性。
將元組存儲(chǔ)在計(jì)算機(jī)系統(tǒng)中作為“記錄”。每個(gè)元組屬性值由記錄內(nèi)部的被稱為字 段的字節(jié)序列表示。
關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)執(zhí)行用戶應(yīng)用提供的查詢操作。查詢操作是對(duì)在計(jì) 算機(jī)的主存儲(chǔ)器中存儲(chǔ)的數(shù)據(jù)庫記錄來執(zhí)行的。由于需要快速存取數(shù)據(jù),主存儲(chǔ)器通常由 隨機(jī)存取存儲(chǔ)器(RAM)提供。盡管提供必要的快速存取時(shí)間,但是通常用于提供主存儲(chǔ)器 的RAM的類型是需要電力來存儲(chǔ)信息的易失性存儲(chǔ)技術(shù)。此外,RAM的相對(duì)高的成本意味 著,對(duì)于相當(dāng)大的數(shù)據(jù)庫,主存儲(chǔ)器不夠大來存儲(chǔ)數(shù)據(jù)庫的所有表的所有記錄。
因此,數(shù)據(jù)庫表也被存儲(chǔ)在輔助存儲(chǔ)器中,輔助存儲(chǔ)器通常由較慢的但是具有較 大容量的、非易失性的諸如硬盤驅(qū)動(dòng)器的存儲(chǔ)設(shè)備來提供。
在想要讀取或修改數(shù)據(jù)庫的記錄的情況下,首先確定那個(gè)記錄是否存在于主存儲(chǔ) 器中。如果特定的記錄不存在于主存儲(chǔ)器中,則其位于輔助存儲(chǔ)器中并將其復(fù)制到主存儲(chǔ) 器以用于處理。在主存儲(chǔ)器沒有足夠的空閑空間來存儲(chǔ)從輔助存儲(chǔ)器復(fù)制的附加記錄的情 況下,有必要確定存儲(chǔ)在主存儲(chǔ)器中的哪個(gè)記錄應(yīng)該被排出(eject)以創(chuàng)建空間來存儲(chǔ)從 輔助存儲(chǔ)器復(fù)制的附加記錄。如果選擇的從主存儲(chǔ)器排出的記錄在主存儲(chǔ)器中的時(shí)候已 經(jīng)被修改,則將修改的記錄復(fù)制回輔助存儲(chǔ)器以便確保當(dāng)記錄從主存儲(chǔ)器排出時(shí)不丟失改 變。
數(shù)據(jù)以8個(gè)比特的匯集形式被存儲(chǔ)在存儲(chǔ)器中,每個(gè)匯集被稱為字節(jié)。盤被邏輯 地設(shè)置成由特定數(shù)量的字節(jié)組成的固定大小的組,固定大小的組通常被稱為“塊”。從盤中 讀取數(shù)據(jù)和將數(shù)據(jù)寫入盤的操作被統(tǒng)稱為I/o操作,以及在每個(gè)I/O操作中讀取和寫入整 數(shù)數(shù)量的塊通常是更有效率的。
將包括在數(shù)據(jù)庫的表中的記錄以組的形式存儲(chǔ),組被稱為頁。經(jīng)常將數(shù)據(jù)庫的頁 的大小選擇為與數(shù)據(jù)庫存儲(chǔ)在其上的硬盤的塊的大小相匹配。以這種方式,當(dāng)在硬盤和主 存儲(chǔ)器之間以整頁的方式復(fù)制數(shù)據(jù)庫的記錄,而不是以單獨(dú)的記錄的方式復(fù)制數(shù)據(jù)庫的記 錄時(shí),在主存儲(chǔ)器和輔助存儲(chǔ)器之間記錄傳遞的效率可以得到最大化。也就是說,當(dāng)需要特定的記錄時(shí),將包含那個(gè)記錄的頁從輔助存儲(chǔ)器復(fù)制到主存儲(chǔ)器。如果修改了記錄,則將 (包括修改的)整頁從主存儲(chǔ)器復(fù)制到輔助存儲(chǔ)器。
常見的數(shù)據(jù)庫管理方法在將任何數(shù)據(jù)加入數(shù)據(jù)庫之前通過為每個(gè)表定義架構(gòu)來 為與特定的表相關(guān)聯(lián)的記錄定義固定的結(jié)構(gòu)。這樣的架構(gòu)定義了多個(gè)字段,每個(gè)記錄為多 個(gè)字段提供值,以及還定義了每個(gè)字段的數(shù)據(jù)類型和其它類似的信息。
然而,當(dāng)需要改變數(shù)據(jù)庫的結(jié)構(gòu)時(shí)出現(xiàn)問題。例如,用戶應(yīng)用可能希望將新的字段 加入與特定的表相關(guān)聯(lián)的記錄、更改現(xiàn)有字段的格式或刪除一個(gè)或多個(gè)現(xiàn)有的字段。盡管 這樣的變化可以經(jīng)常被應(yīng)用到已經(jīng)包含數(shù)據(jù)的數(shù)據(jù)庫上,但是當(dāng)這完成時(shí),有必要根據(jù)新 結(jié)構(gòu)來重新組織數(shù)據(jù)庫中的所有數(shù)據(jù)??紤]到如果在這樣的重新組織期間允許用戶應(yīng)用存 取數(shù)據(jù)則有可能發(fā)生錯(cuò)誤,通常有必要在重新組織期間防止對(duì)數(shù)據(jù)庫進(jìn)行存取。這導(dǎo)致由 將數(shù)據(jù)庫用于其操作的應(yīng)用所提供的服務(wù)的服務(wù)中斷,這樣是不希望的,尤其對(duì)于那些具 有嚴(yán)格的可用性要求的應(yīng)用(例如,一天24小時(shí),一星期7天)。
本發(fā)明的目的是消除或減輕以上概述的問題中的至少一些。發(fā)明內(nèi)容
根據(jù)本發(fā)明的第一方面,提供一種用于在數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的方法,數(shù)據(jù)庫定義 表以及數(shù)據(jù)包括多個(gè)記錄,每個(gè)記錄包括至少一個(gè)字段的值。該方法包括存儲(chǔ)多個(gè)架構(gòu),每 個(gè)架構(gòu)定義與所述表相關(guān)聯(lián)的相應(yīng)的字段集合,以及將所述記錄中的每個(gè)與標(biāo)識(shí)所述架構(gòu) 之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
存儲(chǔ)定義與特定的表相關(guān)聯(lián)的相應(yīng)的字段集合的多個(gè)架構(gòu)是有利的,因?yàn)榕c特定 的表相關(guān)聯(lián)的不同記錄不需要共享相同的架構(gòu)??赡苡羞@種情況,特定的表的記錄最初使 用第一架構(gòu)來定義,但是后來想要定義第二架構(gòu),第二架構(gòu)將用于定義特定的表的另外的 記錄。通過使用以上描述的方法,在創(chuàng)建第二架構(gòu)之前定義的記錄可以繼續(xù)根據(jù)第一架構(gòu) 來定義。這保證將與新的架構(gòu)相關(guān)聯(lián)的新的記錄添加到表而無需更新已經(jīng)存儲(chǔ)在表中的數(shù) 據(jù)。因此,使得更新表的結(jié)構(gòu)的任務(wù)獨(dú)立于更新已經(jīng)與所述表相關(guān)聯(lián)的數(shù)據(jù)的結(jié)構(gòu)的任務(wù), 這消除了在改變數(shù)據(jù)庫表的結(jié)構(gòu)時(shí)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)執(zhí)行大規(guī)模批量更新的需要。這提供 包括縮短執(zhí)行更新過程所花費(fèi)的時(shí)間的多個(gè)優(yōu)點(diǎn)。
也就是說,在一些常規(guī)的設(shè)置中,在使用ALTER TABLE (更改表)命令的情況下,更 新特定的表的所有記錄的結(jié)構(gòu)。這在計(jì)算上是昂貴的并且通常至少要求在命令執(zhí)行的同時(shí) 防止用戶應(yīng)用的寫操作(例如,插入和更新操作);這對(duì)于一些應(yīng)用可能是不可接受的。通過 只是添加新的架構(gòu)定義并允許根據(jù)舊的和新的架構(gòu)來定義記錄,實(shí)現(xiàn)相當(dāng)大的好處。因此, 有可能通過定義新的架構(gòu)來在特定的表中定義新的字段。如果新創(chuàng)建的記錄和更新的記錄 具有相關(guān)聯(lián)的引用新的架構(gòu)的標(biāo)識(shí)數(shù)據(jù),則它們可以包括新的字段。然而,其它的記錄不需 要包括新的字段,因?yàn)樗鼈兛梢岳^續(xù)與引用早期架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
所述架構(gòu)中的每個(gè)可以具有相關(guān)聯(lián)的架構(gòu)標(biāo)識(shí)符,以及標(biāo)識(shí)數(shù)據(jù)可以包括架構(gòu)標(biāo) 識(shí)符。例如,每個(gè)架構(gòu)可以具有相關(guān)聯(lián)的版本號(hào),從而允許容易地區(qū)分特定的表的不同架 構(gòu)。
可以將多個(gè)架構(gòu)存儲(chǔ)在所述數(shù)據(jù)庫的數(shù)據(jù)字典中。數(shù)據(jù)字典有時(shí)被稱為系統(tǒng)目錄 以及術(shù)語數(shù)據(jù)字典和系統(tǒng)目錄在本文中被類似地使用。數(shù)據(jù)字典通常包含關(guān)于數(shù)據(jù)庫的表的信息,以及除了數(shù)據(jù)庫表的架構(gòu)之外,還可以包括指示表名稱、索引名稱的數(shù)據(jù)和對(duì)數(shù)據(jù) 的完整性約束。
該方法還可以包括創(chuàng)建另外的架構(gòu),另外的架構(gòu)定義與所述表相關(guān)聯(lián)的數(shù)據(jù)的另 外的字段集合,以及存儲(chǔ)所述另外的架構(gòu)。
該方法還可以包括讀取所述記錄之一和修改與所述讀取的記錄相關(guān)聯(lián)的標(biāo)識(shí)數(shù) 據(jù)來標(biāo)識(shí)所述多個(gè)架構(gòu)中的另外一個(gè)。
多個(gè)記錄可以具有共同的相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)。也就是說,單項(xiàng)標(biāo)識(shí)數(shù)據(jù)可以與多 個(gè)記錄相關(guān)聯(lián),指示所述多個(gè)記錄中的每個(gè)與所述標(biāo)識(shí)數(shù)據(jù)標(biāo)識(shí)的架構(gòu)相關(guān)聯(lián)。例如,所述 多個(gè)記錄可以存儲(chǔ)在一頁或多頁中。將所述記錄中的每個(gè)與標(biāo)識(shí)所述架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù) 相關(guān)聯(lián)可以包括將標(biāo)識(shí)數(shù)據(jù)與每頁相關(guān)聯(lián)以及每頁中僅存儲(chǔ)與所述架構(gòu)之一相關(guān)聯(lián)的記 錄,所述架構(gòu)之一由與那頁相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)標(biāo)識(shí)。也就是說,單項(xiàng)標(biāo)識(shí)數(shù)據(jù)可以針對(duì)每頁 來存儲(chǔ)以及可以與存儲(chǔ)在那頁中的所有記錄相關(guān)聯(lián)。
該方法可以還包括從第一頁記錄讀取第一記錄,所述第一頁記錄與標(biāo)識(shí)第一架構(gòu) 的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián),接收將用于更新所述第一記錄的更新數(shù)據(jù),以及在第二頁記錄中存儲(chǔ) 第二記錄,所述第二記錄是基于所述第一記錄和所述更新數(shù)據(jù)以及所述第二頁與標(biāo)識(shí)第二 架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
每個(gè)記錄可以與相應(yīng)的標(biāo)識(shí)所述多個(gè)架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)??梢栽诿總€(gè)記 錄中存儲(chǔ)標(biāo)識(shí)數(shù)據(jù),例如在每個(gè)記錄的首部中。
該方法還可以包括讀取記錄,所述記錄與標(biāo)識(shí)第一架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián),接收 將用于更新所述記錄的更新數(shù)據(jù),以及基于所述更新數(shù)據(jù)來更新所述記錄并修改與所述記 錄相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)以標(biāo)識(shí)第二架構(gòu)。
所述多個(gè)架構(gòu)中的第一架構(gòu)可以包括第一多個(gè)字段以及所述多個(gè)架構(gòu)中的第二 架構(gòu)可以包括第二多個(gè)字段,所述第二多個(gè)字段包括所述第一多個(gè)字段和至少一個(gè)另外的 字段。所述第二架構(gòu)的所述至少一個(gè)另外的字段可以與至少一個(gè)缺省值相關(guān)聯(lián)。備選地, 第二多個(gè)字段可以是所述第一多個(gè)字段的子集。
根據(jù)本發(fā)明的第二方面,提供了一種從數(shù)據(jù)庫讀取記錄的方法,數(shù)據(jù)庫定義表以 及數(shù)據(jù)包括多個(gè)記錄,每個(gè)記錄包括至少一個(gè)字段的值,數(shù)據(jù)庫存儲(chǔ)多個(gè)架構(gòu),以及每個(gè)架 構(gòu)定義與所述表相關(guān)聯(lián)的相應(yīng)的字段集合。該方法包括讀取與所述記錄相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù) 以標(biāo)識(shí)所述架構(gòu)之一,以及基于所述標(biāo)識(shí)的架構(gòu)來讀取所述至少一個(gè)記錄。從數(shù)據(jù)庫讀取 記錄可以與來自所述數(shù)據(jù)庫的用戶的用于僅獲得記錄的數(shù)據(jù)內(nèi)容和/或用于更新所述記 錄的內(nèi)容的操作相關(guān)。
在本發(fā)明的第一方面的上下文中描述的特征可以應(yīng)用到本發(fā)明的第二方面。
本發(fā)明的實(shí)施例能以任何方便的方式來實(shí)現(xiàn),包括通過適合的計(jì)算機(jī)程序。因此, 本發(fā)明的一些方面還提供承載計(jì)算機(jī)可讀指令的計(jì)算機(jī)可讀介質(zhì),計(jì)算機(jī)可讀指令配置為 當(dāng)被載入到計(jì)算機(jī)裝置中時(shí)執(zhí)行如以上描述的方法。
還提供了計(jì)算機(jī)裝置,包括存儲(chǔ)器,存儲(chǔ)處理器可讀指令,以及處理器,配置為讀 取和執(zhí)行存儲(chǔ)在所述存儲(chǔ)器中的指令。所述處理器可讀指令包括控制處理器來執(zhí)行如以上 描述的方法的指令。


現(xiàn)在參照附圖來描述本發(fā)明的實(shí)施例,實(shí)施例僅作為示范,在附圖中圖1是根據(jù)本發(fā)明的實(shí)施例的配置為提供數(shù)據(jù)庫的計(jì)算機(jī)系統(tǒng)的示意圖;圖2是用于實(shí)現(xiàn)常規(guī)數(shù)據(jù)庫的結(jié)構(gòu)的示意圖;圖3是示出如何修改圖2的結(jié)構(gòu)來實(shí)現(xiàn)本發(fā)明的實(shí)施例的示意圖;圖4是示出所進(jìn)行的將表的架構(gòu)添加到使用圖3的結(jié)構(gòu)實(shí)現(xiàn)的數(shù)據(jù)庫的處理的流程圖;圖5是示出所進(jìn)行的從使用圖3的結(jié)構(gòu)實(shí)現(xiàn)的數(shù)據(jù)庫讀取記錄的處理的流程圖;圖6是示出所進(jìn)行的在使用圖3的結(jié)構(gòu)實(shí)現(xiàn)的數(shù)據(jù)庫中存儲(chǔ)記錄的處理的流程圖;圖7是示出更新操作的兩頁的示意圖;圖8是示出所進(jìn)行的更新存儲(chǔ)的記錄的處理的流程圖;圖9是命名為“水果”的表的兩個(gè)架構(gòu)的示意圖;圖10是“水果”表的三個(gè)記錄的示意圖;以及 圖11和12是“水果”表的不意圖。
具體實(shí)施方式
圖1示出設(shè)置為實(shí)現(xiàn)本發(fā)明的實(shí)施例的計(jì)算機(jī)I。計(jì)算機(jī)I包括由RAM提供的主 存儲(chǔ)器2和由硬盤驅(qū)動(dòng)器提供的輔助存儲(chǔ)器3。處理器4設(shè)置為讀取并執(zhí)行存儲(chǔ)在主存儲(chǔ) 器2的第一邏輯部分5中的指令。由那些指令操控的數(shù)據(jù)被存儲(chǔ)在主存儲(chǔ)器2的第二邏輯 部分6中。存儲(chǔ)在主存儲(chǔ)器2的第一邏輯部分5中的指令控制處理器4來在主存儲(chǔ)器2的 第二邏輯部分6和輔助存儲(chǔ)器3之間復(fù)制數(shù)據(jù)等。
存儲(chǔ)在主存儲(chǔ)器2的第一邏輯部分5中的指令控制對(duì)存儲(chǔ)在主存儲(chǔ)器2中的數(shù)據(jù) 的處理,存儲(chǔ)在主存儲(chǔ)器2中的數(shù)據(jù)構(gòu)成存儲(chǔ)在輔助存儲(chǔ)器3中的關(guān)系數(shù)據(jù)庫的一部分。關(guān) 系數(shù)據(jù)庫的數(shù)據(jù)以多頁7的形式存儲(chǔ)在主存儲(chǔ)器2和輔助存儲(chǔ)器3中,每頁包括數(shù)據(jù)庫記 錄形式的預(yù)定量的數(shù)據(jù)。在輔助存儲(chǔ)器3和主存儲(chǔ)器2之間以整頁的方式傳遞數(shù)據(jù)。主存 儲(chǔ)器2不足夠大來同時(shí)保存所有的頁7。因此輔助存儲(chǔ)器3用于存儲(chǔ)所有的頁7,以及當(dāng)需 要頁7用于處理時(shí),指令控制處理器4來將頁7從輔助存儲(chǔ)器3復(fù)制到主存儲(chǔ)器2,并且當(dāng) 主存儲(chǔ)器2中不再需要頁7時(shí),將頁7復(fù)制回輔助存儲(chǔ)器3以用于永久性存儲(chǔ)。
圖2示出包括記錄9的兩頁8a和8b。頁8a、8b均包括頁首10a、10b,頁首10a、 IOb包括多個(gè)被稱為“槽(slot)” 11的字段。每個(gè)槽存儲(chǔ)在頁內(nèi)的存儲(chǔ)特定的記錄9的偏 移??紤]到每個(gè)槽11可以存儲(chǔ)由在頁內(nèi)的在特定的槽引用的記錄之前的特定的記錄的大 小確定的偏移,以這種方式使用槽11允許使用可變長(zhǎng)度的記錄。以這種方式,不同的記錄 可以具有不同的大小,以及具體而言在不同的記錄中與特定的字段相關(guān)聯(lián)的數(shù)據(jù)可以占據(jù) 不同量的空間。使用所描述的這類型存儲(chǔ),可以使用包括頁標(biāo)識(shí)符和槽標(biāo)識(shí)符的記錄標(biāo)識(shí) 符(rid)來方便地標(biāo)識(shí)每個(gè)記錄。例如在圖2中示出的記錄2具有標(biāo)識(shí)頁8a和槽2的rid。
為了允許處理器4執(zhí)行的用戶應(yīng)用有效地定位特定的數(shù)據(jù)庫表的特定的記錄,使 用被稱為索引12的附加的數(shù)據(jù)結(jié)構(gòu)。索引12是使用某一記錄字段來作為排序標(biāo)準(zhǔn)的排序 的記錄引用的列表。每個(gè)數(shù)據(jù)庫表具有至少一個(gè)索引來允許跨數(shù)據(jù)庫表的所有記錄的遍 歷。索引的排序標(biāo)準(zhǔn)是使用表的被稱為‘鍵(key)’的非空值屬性來建立的。每次將記錄插入表中或從表中刪除記錄,就更新相關(guān)聯(lián)的表索引。在每個(gè)索引單元中保存記錄標(biāo)識(shí)符 (rid)以允許在遍歷索引時(shí)存取相應(yīng)的記錄。
存儲(chǔ)的記錄9包括與記錄相關(guān)聯(lián)的表定義的多個(gè)字段中的每個(gè)字段的值。例如, 在圖2的示例中,記錄9與表13相關(guān)聯(lián)。架構(gòu)14與表13相關(guān)聯(lián)并且被存儲(chǔ)在數(shù)據(jù)字典15 中(數(shù)據(jù)字典15有時(shí)也被稱為系統(tǒng)目錄)。架構(gòu)14指示與表13相關(guān)聯(lián)的每個(gè)記錄存儲(chǔ)三 個(gè)字段的數(shù)據(jù)值,以及表13的示意圖示出每個(gè)記錄包括三個(gè)數(shù)據(jù)值,三個(gè)字段中的每個(gè)字 段一個(gè)數(shù)據(jù)值。更一般來說,數(shù)據(jù)字典15包含關(guān)于數(shù)據(jù)庫的表的信息,以及除了以上描述 的這類型的數(shù)據(jù)庫表的架構(gòu)之外,還包括指示表名稱、索引名稱的數(shù)據(jù)和對(duì)數(shù)據(jù)的完整性 約束。數(shù)據(jù)字典還可以包括另外的信息,諸如數(shù)據(jù)庫的表之間的關(guān)系的定義和數(shù)據(jù)庫的用 戶存取許可。
圖3示出根據(jù)本發(fā)明的實(shí)施例對(duì)圖2的設(shè)置的修改??梢钥闯?,數(shù)據(jù)字典15現(xiàn)在 包括另外的架構(gòu)16。第一架構(gòu)14和第二架構(gòu)16都與表13相關(guān)聯(lián),但是指定表13的相應(yīng) 的特性。更具體地,第二架構(gòu)16包括表13的附加字段17的定義。因此與表13相關(guān)聯(lián)的 第一記錄集合18的記錄均包括第一架構(gòu)14指定的三個(gè)字段的值,而與表13相關(guān)聯(lián)的第二 記錄集合19的記錄均包括如第二架構(gòu)16指定的四個(gè)字段的值。將理解的是,在其它示例 中,第二架構(gòu)16可以僅包括第一架構(gòu)14的字段的子集,從而允許移除過時(shí)的字段。
架構(gòu)14、16均具有相關(guān)聯(lián)的版本號(hào),允許方便地標(biāo)識(shí)每個(gè)架構(gòu)。在以這種方式提 供兩個(gè)架構(gòu)14、16的情況下,每個(gè)記錄9設(shè)有版本號(hào)字段20以便標(biāo)識(shí)根據(jù)其來定義記錄的 架構(gòu)。以這種方式,可以為單個(gè)表提供多個(gè)不同的架構(gòu)14、16,以及可以根據(jù)每個(gè)架構(gòu)來定 義和存儲(chǔ)記錄。這是特別方便的,因?yàn)榱硗獾募軜?gòu)可以被添加到數(shù)據(jù)字典15以及接下來使 用另外的架構(gòu)之一的記錄可以被添加,這些記錄只是包括標(biāo)識(shí)合適的架構(gòu)的數(shù)據(jù)。
現(xiàn)在參照?qǐng)D4至圖8來描述使用參照?qǐng)D3描述的結(jié)構(gòu)所進(jìn)行的處理。
圖4是示出所進(jìn)行的將架構(gòu)添加到數(shù)據(jù)字典15的處理的流程圖。該方法是通過 處理器4執(zhí)行存儲(chǔ)在主存儲(chǔ)器2的第一部分5中的指令來執(zhí)行的。在步驟SI I,定義表13 的新的架構(gòu)。新的架構(gòu),可以例如,定義表13的附加字段以及可以指定那個(gè)附加字段的缺 省值。在步驟S12,確定與表13相關(guān)聯(lián)的架構(gòu)的當(dāng)前最高版本號(hào),并為新的記錄架構(gòu)選擇下 一個(gè)版本號(hào)。在步驟S13,將新的架構(gòu)與合適的版本號(hào)一起添加到數(shù)據(jù)字典15。當(dāng)已經(jīng)以 這種方式將新的架構(gòu)添加到數(shù)據(jù)字典15時(shí),可以存儲(chǔ)與表13相關(guān)聯(lián)的記錄連同標(biāo)識(shí)新的 架構(gòu)的版本號(hào)。
圖5示出所進(jìn)行的從表13中讀取數(shù)據(jù)的處理。該處理是通過處理器4執(zhí)行存儲(chǔ) 在主存儲(chǔ)器2的第一部分5中的指令來執(zhí)行的。在步驟S21,從索引12獲得想要的記錄的 記錄標(biāo)識(shí)符。如以上討論的,記錄標(biāo)識(shí)符包括頁號(hào)和頁內(nèi)的槽號(hào)。在步驟S22進(jìn)行嘗試來 在主存儲(chǔ)器2中定位rid指示的頁。在步驟S23進(jìn)行檢查來確定是否已經(jīng)在主存儲(chǔ)器2中 成功定位rid指示的頁。如果沒有成功定位,則在步驟S24將標(biāo)識(shí)的頁從輔助存儲(chǔ)器3載 入到主存儲(chǔ)器2中以及處理轉(zhuǎn)到步驟S25。如果在步驟S22在主存儲(chǔ)器2中定位到頁,則處 理從步驟S23直接轉(zhuǎn)到步驟S25。
在步驟S25使用包括在rid內(nèi)的槽號(hào)來在相關(guān)頁內(nèi)定位記錄。在步驟S26讀取記 錄的版本字段20以便確定與讀取的記錄相關(guān)聯(lián)的架構(gòu)。在步驟S27,從數(shù)據(jù)字典15獲得與 讀取的版本號(hào)相關(guān)聯(lián)的架構(gòu)。在步驟S28,使用在步驟S27獲得的讀取的架構(gòu),依次讀取記錄的每個(gè)字段。具體而言,架構(gòu)允許標(biāo)識(shí)包括在記錄中的字段,包括標(biāo)識(shí)每個(gè)字段的開始和 結(jié)束的位置,以便使得每個(gè)字段的值能夠被讀取。
圖6的流程圖示出所進(jìn)行的將記錄添加到數(shù)據(jù)庫的處理。該處理是通過處理器4 執(zhí)行存儲(chǔ)在主存儲(chǔ)器2的第一部分5中的指令來執(zhí)行的。在步驟S31從數(shù)據(jù)字典15獲得 與記錄相關(guān)聯(lián)的表的架構(gòu)的最近的版本。以這種方式,當(dāng)新的記錄被添加到數(shù)據(jù)庫時(shí),那個(gè) 新的記錄與相關(guān)數(shù)據(jù)庫表的最近添加的架構(gòu)相關(guān)聯(lián)。在步驟S32,標(biāo)識(shí)適合存儲(chǔ)新的記錄 的頁。用于存儲(chǔ)記錄的頁的標(biāo)識(shí)將取決于將記錄分配到頁的方式。例如,如果每頁存儲(chǔ)與 特定的數(shù)據(jù)庫表的特定的架構(gòu)相關(guān)聯(lián)的記錄,則存儲(chǔ)根據(jù)相關(guān)的架構(gòu)定義的記錄的頁被定 位。合適的頁的定位可以涉及將頁從輔助存儲(chǔ)器2復(fù)制到主存儲(chǔ)器3中,或可以涉及創(chuàng)建 完全新的頁。然而,在頁可以存儲(chǔ)與不同的架構(gòu)相關(guān)聯(lián)的記錄的情況下,如果在最近創(chuàng)建的 頁中有足夠的空間可用,則最近創(chuàng)建的頁可以用于存儲(chǔ)記錄,否則可以創(chuàng)建新的頁。在步驟 S33,將新的記錄添加到定位的頁,以及在步驟S34,將在步驟S31獲得的與架構(gòu)相關(guān)聯(lián)的架 構(gòu)版本號(hào)寫到新的記錄。在步驟S35,更新索引12以便指示新的記錄的存在以及以便指示 存儲(chǔ)記錄的頁號(hào)和槽號(hào)。
現(xiàn)在參照?qǐng)D7和8來描述所進(jìn)行的更新記錄的處理。
圖7示出存儲(chǔ)數(shù)據(jù)庫記錄的兩頁21a、21b。記錄22將被更新。參見圖8,在步驟 S41讀取記錄22,以及在步驟S42獲得將要用于更新記錄22的更新數(shù)據(jù)。在步驟S43進(jìn)行 檢查以確定與在步驟S41讀取的記錄相關(guān)聯(lián)的版本號(hào)是否引用相關(guān)數(shù)據(jù)庫表的最新架構(gòu)。 如果是引用相關(guān)數(shù)據(jù)庫表的最新架構(gòu),則在步驟S44將更新數(shù)據(jù)用于更新頁21a內(nèi)的記錄 22。
然而,如果步驟S43的檢查確定與在步驟S41讀取的記錄相關(guān)聯(lián)的版本號(hào)不是最 新版本號(hào),則在步驟S45創(chuàng)建新的記錄。在描述的示例中,在頁21b中創(chuàng)建新的記錄23,因 為頁21b用于存儲(chǔ)與相關(guān)表的最新架構(gòu)相關(guān)聯(lián)的記錄。在步驟S46基于在步驟S41讀取的 數(shù)據(jù)、在步驟S42獲得的更新數(shù)據(jù)和相關(guān)表的最新架構(gòu)來將數(shù)據(jù)寫到新的記錄。在步驟S47 將標(biāo)識(shí)最新架構(gòu)的版本號(hào)寫到記錄23。在步驟S48記錄22被標(biāo)記為過時(shí),使得在合適時(shí)可 以運(yùn)行過程以恢復(fù)用于存儲(chǔ)記錄22的空間??梢酝ㄟ^將“墓石(tomb-stone)”值寫到記錄 的合適的字段來標(biāo)記記錄22過時(shí)。
處理從步驟S48轉(zhuǎn)到步驟S49,其中更新索引12以指示記錄被存儲(chǔ)的位置。
在本發(fā)明的備選實(shí)施例中,即使在步驟S43確定在步驟S41讀取的記錄不是與架 構(gòu)的最新版本相關(guān)聯(lián),如果在步驟S42獲得的更新數(shù)據(jù)不要求更新用于定義記錄的架構(gòu) (例如,更新數(shù)據(jù)不涉及不是由當(dāng)前定義記錄的架構(gòu)的版本定義的字段),以及如果頁21a有 足夠的空間來容納要求的更新,則在頁21a內(nèi)更新記錄22,而不是創(chuàng)建記錄23。這在考慮 到避免在新的頁中創(chuàng)建新的記錄的需要的一些情況中可以是有利的。
現(xiàn)在參照?qǐng)D9至圖12提出使用以上描述的結(jié)構(gòu)和方法實(shí)現(xiàn)的數(shù)據(jù)庫的具體的示 例。
圖9示出與數(shù)據(jù)庫中命名為“水果”的表相關(guān)聯(lián)的第一架構(gòu)和第二架構(gòu)24、25。第 一架構(gòu)24定義命名為名稱、顏色和重量的三個(gè)字段,定義這些字段中的每個(gè)的列位置,定 義每個(gè)字段的數(shù)據(jù)類型和每個(gè)字段的缺省值。
圖10示出存儲(chǔ)根據(jù)第一架構(gòu)24定義的三個(gè)記錄的頁26的一部分。頁26包括通過三個(gè)記錄在頁26內(nèi)的偏移來引用這三個(gè)記錄的三個(gè)槽27。第一槽引用第一記錄28,第一 記錄28開始于偏移零處并包括與其中名稱字段具有值“蘋果”的記錄相關(guān)聯(lián)的數(shù)據(jù)。第二 槽引用第二記錄29,第二記錄29開始于偏移十三處并包括與其中名稱字段具有值“草莓” 的記錄相關(guān)聯(lián)的數(shù)據(jù)。第三槽引用第三記錄30,第三記錄30開始于偏移三十處并包括與其 中名稱字段具有值“菠蘿”的記錄相關(guān)聯(lián)的數(shù)據(jù)。
在創(chuàng)建第一架構(gòu)24和存儲(chǔ)這三個(gè)記錄28、29、30之后,使用參照?qǐng)D4描述的處理 來創(chuàng)建第二架構(gòu)25??梢钥闯觯诙軜?gòu)25定義參照第一架構(gòu)24討論的那三個(gè)字段,但是 附加地定義“學(xué)名”字段。當(dāng)已經(jīng)以這種方式創(chuàng)建第二架構(gòu)25時(shí),如參照?qǐng)D5的處理所描 述的,新創(chuàng)建的記錄與第二架構(gòu)25相關(guān)聯(lián)。類似地,在以任何方式更新與第一架構(gòu)24相關(guān) 聯(lián)的記錄的情況下,可以如參照?qǐng)D7和圖8所描述的將它更新來參考第二架構(gòu)25。以這種 方式,“水果”表包括與第二架構(gòu)25相關(guān)聯(lián)的一些記錄和與第一架構(gòu)24相關(guān)聯(lián)的另一些記 錄,每個(gè)記錄標(biāo)識(shí)架構(gòu)24、25之一。圖11示出“水果”表的記錄??梢钥闯?,參照?qǐng)D10描 述的三個(gè)記錄31包括第一架構(gòu)24定義的那三個(gè)字段的值,而具有名稱字段值“李子”的新 記錄32包括第二架構(gòu)25定義的那四個(gè)字段的值。然而,從圖12可以看出,在更新操作之 后,具有名稱字段值“蘋果”的記錄是使用第二架構(gòu)25來定義的而且現(xiàn)在包括附加字段“學(xué) 名”的值。
前面的描述已經(jīng)涉及其中每個(gè)記錄具有相關(guān)聯(lián)的用于標(biāo)識(shí)存儲(chǔ)的架構(gòu)的版本號(hào) 字段的實(shí)施例。在備選的實(shí)施例中,頁可以包括版本號(hào)字段,而且這個(gè)字段可以用于將頁 內(nèi)所有的記錄與特定的架構(gòu)版本相關(guān)聯(lián),由此消除每個(gè)記錄包括它自己的版本號(hào)字段的需 要。在這樣的實(shí)施例中,將理解的是,特定的頁中的所有記錄都與特定的數(shù)據(jù)庫表的共同架 構(gòu)相關(guān)聯(lián)。
將理解的是,數(shù)據(jù)字典和因此以上討論的架構(gòu)在數(shù)據(jù)庫內(nèi)可以以任何方便的方式 來內(nèi)部地表示,而且不需要是如圖9中所示的表格形式或者確實(shí)保存在單個(gè)結(jié)構(gòu)中。也就 是說,例如,每個(gè)架構(gòu)可以在數(shù)據(jù)字典15內(nèi)作為分離的(discrete)結(jié)構(gòu)來存儲(chǔ)。
以上已經(jīng)描述了當(dāng)記錄成為過時(shí)的時(shí)候(例如,當(dāng)以在新的頁中創(chuàng)建新的記錄這 樣的方式來更新記錄時(shí))記錄被適當(dāng)?shù)貥?biāo)識(shí)為過時(shí)。當(dāng)特定的頁內(nèi)的所有記錄是過時(shí)的時(shí) 候,可以釋放用于容納該頁的存儲(chǔ)空間以便允許那個(gè)存儲(chǔ)空間用來存儲(chǔ)其它數(shù)據(jù)。過程可 以在后臺(tái)運(yùn)行以標(biāo)識(shí)能以這種方式丟棄的頁。此外,在一些實(shí)施例中,可以進(jìn)行處理以便從 包括過時(shí)的記錄的頁中移走非過時(shí)的記錄,從而提前可以丟棄頁的時(shí)間。
如果實(shí)現(xiàn)聚集索引,則通過聚集索引鍵排序的記錄可以順序地存儲(chǔ)在單頁中以允 許通過僅存取那個(gè)單頁來存取若干個(gè)連續(xù)的記錄。在關(guān)系數(shù)據(jù)庫中聚集索引的使用經(jīng)常是 重要的,因?yàn)楫?dāng)順序地存取包含在數(shù)據(jù)庫表中的所有記錄時(shí),這樣的索引提供了大的性能 優(yōu)勢(shì)。
在更新操作期間,以及當(dāng)創(chuàng)建新的記錄,而不是在新的頁中插入記錄(如以上參照 圖7和圖8描述的)時(shí),如果記錄包括架構(gòu)標(biāo)識(shí)符,在頁內(nèi)可以容納可變長(zhǎng)度記錄而且頁具 有足夠的空閑空間來容納新的記錄,則新的記錄可以改為被重新分配到相同的頁中。如果 在特定的頁內(nèi)沒有足夠的空閑空間,則可以使用溢出頁來避免將新的記錄存儲(chǔ)在與其相鄰 的記錄完全不同的位置上。這樣的方法允許通過使用聚集索引來達(dá)到的效率效益在本發(fā)明 的實(shí)施例中保持。
以這種方式處理更新操作也是有利的,因?yàn)榭紤]到記錄保持位于相同頁的相同槽 中,包含在索引中的rid (記錄標(biāo)識(shí)符)不需要作為更新操作的一部分來更新。
在使用聚集索引的情況下,當(dāng)插入新的記錄時(shí)可以使用與以上剛描述的用于處理 更新的過程類似的過程。更具體地,新的記錄可以插入由聚集索引的鍵確定的頁中。如以 上解釋的,在頁可以存儲(chǔ)不同長(zhǎng)度的記錄的情況下,與不同架構(gòu)相關(guān)聯(lián)的記錄可以被存儲(chǔ) 在單頁內(nèi)。
已經(jīng)解釋了以上描述的方法允許根據(jù)多個(gè)架構(gòu)來定義與特定的表相關(guān)聯(lián)的記錄。 在一些實(shí)施例中,根據(jù)除了最近定義的架構(gòu)之外的架構(gòu)來定義的記錄可以被處理以便將它 們更新成根據(jù)最近定義的架構(gòu)來定義。這樣的處理可以在數(shù)據(jù)庫負(fù)載為低的時(shí)候進(jìn)行。以 這種方式更新所有的記錄,使得數(shù)據(jù)庫表趨于(converge to )根據(jù)最近定義的架構(gòu)來定義, 而不危及數(shù)據(jù)庫性能。
將理解的是,在根據(jù)不同的架構(gòu)來定義與特定的表相關(guān)聯(lián)的不同記錄的情況下, 一些記錄可以不包括在一個(gè)架構(gòu)中而沒有在另一個(gè)架構(gòu)中定義的特定的字段的數(shù)據(jù)。有各 種可以處理這樣的遺漏數(shù)據(jù)的方法。例如,在新的架構(gòu)將字段添加到表的情況下,在查詢返 回使用架構(gòu)的早期版本定義的不包括那個(gè)字段的記錄的情況下,返回的值可以是新的架構(gòu) 定義的缺省值。備選地,可以返回值,該值指示沒有存儲(chǔ)特定的字段的數(shù)據(jù)。
對(duì)于合適的技術(shù)人員來說,根據(jù)本文中的教導(dǎo),本發(fā)明的各種修改和應(yīng)用將是顯 而易見的,而不背離所附的權(quán)利要求書的范圍。
權(quán)利要求
1.一種在數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的方法,所述數(shù)據(jù)庫定義數(shù)據(jù)關(guān)系的表以及所述數(shù)據(jù)包括多個(gè)記錄,根據(jù)所述表的數(shù)據(jù)關(guān)系,每個(gè)記錄包括至少一個(gè)字段的數(shù)據(jù)值,所述方法包括存儲(chǔ)多個(gè)架構(gòu),每個(gè)架構(gòu)定義與所述表相關(guān)聯(lián)的數(shù)據(jù)的相應(yīng)的字段集合;以及將所述記錄中的每個(gè)與標(biāo)識(shí)所述架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
2.根據(jù)權(quán)利要求1所述的方法,其中,所述架構(gòu)中的每個(gè)具有相關(guān)聯(lián)的架構(gòu)標(biāo)識(shí)符, 以及所述標(biāo)識(shí)數(shù)據(jù)包括架構(gòu)標(biāo)識(shí)符。
3.根據(jù)前面任何權(quán)利要求所述的方法,其中,所述多個(gè)架構(gòu)存儲(chǔ)在所述數(shù)據(jù)庫的數(shù)據(jù)字典中。
4.根據(jù)前面任何權(quán)利要求所述的方法,還包括創(chuàng)建另外的架構(gòu),所述另外的架構(gòu)定義與所述表相關(guān)聯(lián)的數(shù)據(jù)的另外的字段集合;以及存儲(chǔ)所述另外的架構(gòu)。
5.根據(jù)前面任何權(quán)利要求所述的方法,還包括讀取所述記錄之一;以及修改與所述讀取的記錄相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)來標(biāo)識(shí)所述多個(gè)架構(gòu)中的另外一個(gè)。
6.根據(jù)前面任何權(quán)利要求所述的方法,其中,多個(gè)記錄具有共同的相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)。
7.根據(jù)權(quán)利要求6所述的方法,其中,所述多個(gè)記錄存儲(chǔ)在一頁或多頁中,以及其中, 將所述記錄中的每個(gè)與標(biāo)識(shí)所述架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)包括將標(biāo)識(shí)數(shù)據(jù)與每頁相關(guān)聯(lián);以及在每頁中僅存儲(chǔ)與所述架構(gòu)之一相關(guān)聯(lián)的記錄,所述架構(gòu)之一由與那頁相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)標(biāo)識(shí)。
8.根據(jù)權(quán)利要求7所述的方法,還包括從第一頁記錄讀取第一記錄,所述第一頁記錄與標(biāo)識(shí)第一架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián); 接收將用于更新所述第一記錄的更新數(shù)據(jù);以及在第二頁記錄中存儲(chǔ)第二記錄,所述第二記錄是基于所述第一記錄和所述更新數(shù)據(jù)以及所述第二頁與標(biāo)識(shí)第二架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
9.根據(jù)權(quán)利要求1至4中的任何一項(xiàng)所述的方法,其中,將每個(gè)記錄與標(biāo)識(shí)所述架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)包括在每個(gè)記錄中存儲(chǔ)相應(yīng)的標(biāo)識(shí)數(shù)據(jù)。
10.根據(jù)權(quán)利要求9所述的方法,還包括讀取記錄,所述記錄與標(biāo)識(shí)第一架構(gòu)的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián);接收將用于更新所述記錄的更新數(shù)據(jù);以及基于所述更新數(shù)據(jù)來更新所述記錄并修改存儲(chǔ)在所述記錄上的標(biāo)識(shí)數(shù)據(jù)以標(biāo)識(shí)第二架構(gòu)。
11.根據(jù)前面任何權(quán)利要求所述的方法,其中,所述多個(gè)架構(gòu)中的第一架構(gòu)包括數(shù)據(jù)的第一多個(gè)字段以及所述多個(gè)架構(gòu)中的第二架構(gòu)包括數(shù)據(jù)的第二多個(gè)字段,所述第二多個(gè)字段包括數(shù)據(jù)的所述第一多個(gè)字段和至少一個(gè)另外的字段。
12.根據(jù)權(quán)利要求11所述的方法,其中,所述第二架構(gòu)的所述至少一個(gè)另外的字段與至少一個(gè)缺省值相關(guān)聯(lián)。
13.—種從數(shù)據(jù)庫讀取記錄的方法,所述數(shù)據(jù)庫定義表以及數(shù)據(jù)包括多個(gè)記錄,每個(gè)記錄包括至少一個(gè)字段的值,所述數(shù)據(jù)庫存儲(chǔ)多個(gè)架構(gòu),每個(gè)架構(gòu)定義與所述表相關(guān)聯(lián)的相應(yīng)的字段集合,所述方法包括讀取與所述記錄相關(guān)聯(lián)的標(biāo)識(shí)數(shù)據(jù)以標(biāo)識(shí)所述架構(gòu)之一;以及基于所述標(biāo)識(shí)的架構(gòu)來讀取所述至少一個(gè)記錄。
14.一種承載計(jì)算機(jī)可讀指令的計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可讀指令配置為執(zhí)行根據(jù)前面任何權(quán)利要求所述的方法。
15.用于存儲(chǔ)數(shù)據(jù)的計(jì)算機(jī)裝置,所述裝置包括存儲(chǔ)器,存儲(chǔ)處理器可讀指令;以及處理器,配置為讀取和執(zhí)行存儲(chǔ)在所述存儲(chǔ)器中的指令;其中,所述處理器可讀指令包括控制所述處理器來執(zhí)行根據(jù)權(quán)利要求1-13中的任何一項(xiàng)所述的方法的指令。
全文摘要
一種在數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的方法,數(shù)據(jù)庫定義表,以及數(shù)據(jù)包括至少一個(gè)記錄。每個(gè)記錄包括至少一個(gè)字段的值。該方法包括存儲(chǔ)多個(gè)架構(gòu),每個(gè)架構(gòu)定義與所述表相關(guān)聯(lián)的相應(yīng)的字段集合,其中,所述記錄中的每個(gè)與標(biāo)識(shí)所述架構(gòu)之一的標(biāo)識(shí)數(shù)據(jù)相關(guān)聯(lián)。
文檔編號(hào)G06F17/30GK103026354SQ201080066829
公開日2013年4月3日 申請(qǐng)日期2010年3月17日 優(yōu)先權(quán)日2010年3月17日
發(fā)明者G.韋卡斯, J.克馬達(dá), J.薩爾瓦楚亞, A.莫佐, M.A.蒙哈斯洛倫特 申請(qǐng)人:瑞典愛立信有限公司, 馬德里理工大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1