專利名稱::多租戶數(shù)據(jù)庫系統(tǒng)中的自定義實(shí)體和字段的制作方法多租戶數(shù)據(jù)庫系統(tǒng)中的自定義實(shí)體和字段發(fā)明背景本發(fā)明一般涉及多租戶數(shù)據(jù)庫,尤其涉及用于在多租戶數(shù)據(jù)庫系統(tǒng)中創(chuàng)建諸如自定義實(shí)體和字段等自定義對象的系統(tǒng)和方法。在多租戶數(shù)據(jù)庫系統(tǒng),諸如salesforce.com服務(wù)中,使用了多租戶體系結(jié)構(gòu),其中顧客組織(即,租戶)共享一個邏輯數(shù)據(jù)庫中的數(shù)據(jù)庫資源。數(shù)據(jù)庫表本身一般是共享的;數(shù)據(jù)模型中的每一實(shí)體一般包含為每一租戶區(qū)分行的organization—id(組織id)列。在此(被索引的)organizationjd列上的租戶過濾器的上下文中的所有的查詢和數(shù)據(jù)處理用于確保適當(dāng)?shù)陌踩院吞摂M專用數(shù)據(jù)庫的外觀。例如在salesforce.com系統(tǒng)中,該策略被用來向顧客展示諸如」ccow"f(賬戶)、Cowto"(聯(lián)系人)、lead(潛在顧客)和C^ortwm'0;(機(jī)遇)實(shí)體等的標(biāo)準(zhǔn)實(shí)體。然而,顧客可能希望向數(shù)據(jù)庫系統(tǒng)添加除標(biāo)準(zhǔn)應(yīng)用配備的標(biāo)準(zhǔn)實(shí)體和字段以外的他們自己的自定義數(shù)據(jù)。在傳統(tǒng)的客戶機(jī)/服務(wù)器應(yīng)用中,其中顧客具有其自己的物理數(shù)據(jù)庫,自定義數(shù)據(jù)的添加通常是經(jīng)由針對該數(shù)據(jù)庫的DDL(數(shù)據(jù)定義語言)來完成的,以創(chuàng)建新的物理模式——表和列。在在線多租戶數(shù)據(jù)庫系統(tǒng),諸如salesforce.com服務(wù)中,由于各種原因該方法可能是無法維持的。例如,對具有大量租戶(例如,1,000或10,000或更多租戶的數(shù)量級)的數(shù)據(jù)庫系統(tǒng),所有期望的模式的聯(lián)合將淹沒底層數(shù)據(jù)詞典式目錄(例如,Oracle詞典)。此外,維護(hù)所有這些模式對象將是DBA(數(shù)據(jù)庫管理員)的幾乎不可能的負(fù)擔(dān)。此外,當(dāng)前的關(guān)系型數(shù)據(jù)庫不能足夠良好地支持在線DDL(在高度并發(fā)事務(wù)系統(tǒng)中)以便組織能維持邏輯獨(dú)立。具體地,一個組織進(jìn)行的模式創(chuàng)建將對引起不可接受的延遲的所有其它顧客鎖定應(yīng)用。從而,期望提供一種系統(tǒng)和方法,它們提供在固定物理模式中存儲可變模式數(shù)據(jù)以便克服以上和其它問題的方法。發(fā)明簡述本發(fā)明提供用于在固定物理數(shù)據(jù)庫模式中容納諸如動態(tài)表和列等可變模式數(shù)據(jù)的新穎的系統(tǒng)和方法。根據(jù)本發(fā)明,提供諸如表等標(biāo)準(zhǔn)對象以供多個租戶或組織使用。每一組織可添加或定義自定義字段以包含在標(biāo)準(zhǔn)對象中。在一個方面,多租戶的自定義字段被存儲在對象數(shù)據(jù)結(jié)構(gòu)內(nèi)的單個字段中,且該單個字段可對每一租戶包含不同的數(shù)據(jù)類型。還提供了索引列,其中租戶可指定用于索引的字段。指定字段的數(shù)據(jù)值被復(fù)制到索引列中,每一索引列可包含多種數(shù)據(jù)類型。每一組織也可定義包含自定義字段和索引列的自定義對象。在一個方面,多個租戶的自定義對象被存儲在單個自定義對象數(shù)據(jù)結(jié)構(gòu)中。單個自定義對象表的主鍵值是全局唯一的,但也可包括可在不同實(shí)體中重用的對象專用標(biāo)識符。根據(jù)本發(fā)明的一方面,提供了一種用于在單個多租戶數(shù)據(jù)結(jié)構(gòu)中存儲多個租戶的多個字段的計算機(jī)實(shí)現(xiàn)的方法。該方法一般包括定義具有多個數(shù)據(jù)列和一個或多個索引列的多租戶數(shù)據(jù)結(jié)構(gòu),為第一租戶定義第一數(shù)據(jù)字段,所述第一字段具有第一數(shù)據(jù)類型;以及為第二租戶定義第二數(shù)據(jù)字段,所述第二字段具有第二數(shù)據(jù)類型,其中第二數(shù)據(jù)類型不同于所述第一數(shù)據(jù)類型。該方法一般還包括當(dāng)所述第一和第二字段中具有數(shù)據(jù)值的記錄由所述第一和第二租戶創(chuàng)建時將第一和第二字段的數(shù)據(jù)值存儲到數(shù)據(jù)結(jié)構(gòu)中的單個列中,其中該單個列對不同租戶包含具有不同數(shù)據(jù)類型的數(shù)據(jù)值;以及響應(yīng)于來自第一租戶的在第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求將單個數(shù)據(jù)列中為第一字段存儲的數(shù)據(jù)值復(fù)制到索引列的第一個中。根據(jù)本發(fā)明的另一方面,提供了一種用于在單個多租戶數(shù)據(jù)結(jié)構(gòu)中容納一個或多個組織的多個表的計算機(jī)實(shí)現(xiàn)的方法。該方法一般包括定義含有主鍵列、組織id列和多個物理數(shù)據(jù)列的多租戶數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一表,該第一表具有第一數(shù)據(jù)字段且第一租戶具有第一租戶id;將第一表id分配給第一表;為第二租戶定義第二表,該第二表具有第二數(shù)據(jù)字段且第二租戶具有第二租戶id;以及將第二表id分配給第二表。當(dāng)由第一租戶為第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄,該方法一般包括將第一數(shù)據(jù)字段的值存儲到該數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列,將第一租戶id存儲到組織id列,并將第一表id存儲到主鍵列。當(dāng)由第二租戶為第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄,該方法一般包括將第二數(shù)據(jù)字段的值存儲到數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列,將第二租戶id存儲到組織id列,并將第二表id存儲到主鍵列,其中第一和第二租戶的第一和第二表被存儲到該數(shù)據(jù)結(jié)構(gòu)中。根據(jù)本發(fā)明的又一方面,提供了一種用于在單個數(shù)據(jù)結(jié)構(gòu)中為一個或多個租戶存儲多個表的計算機(jī)實(shí)現(xiàn)的方法。該方法一般包括定義具有主鍵列、組織id列和多個數(shù)據(jù)列的數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一表,該第一表具有第一數(shù)據(jù)字段,該第一數(shù)據(jù)字段具有第一數(shù)據(jù)類型,且第一租戶具有第一租戶id;將第一表id分配給第一表;為第一租戶定義第二表,該第二表具有第二數(shù)據(jù)字段,該第二數(shù)據(jù)字段具有不同于第一數(shù)據(jù)類型的第二數(shù)據(jù)類型;以及將第二表id分配給第二表。當(dāng).為第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄,該方法一般包括將第一數(shù)據(jù)字段的值存儲到數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列,將第一租戶id存儲到組織id列,并將第一表id存儲到主鍵列。當(dāng)為第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄,該方法一般包括將第二數(shù)據(jù)字段的值存儲到單個數(shù)據(jù)列,將第一租戶id存儲到組織id列,并將第二表id存儲到主鍵列,其中第一租戶的第一和第二表被存儲到數(shù)據(jù)結(jié)構(gòu)中,且其中所述單個數(shù)據(jù)列包括具有所述第一和第二數(shù)據(jù)類型的數(shù)據(jù)值。參考說明書的其余部分,包括附圖和權(quán)利要求書,將理解本發(fā)明的其它特征和優(yōu)點(diǎn)。本發(fā)明的其它特征和優(yōu)點(diǎn)以及本發(fā)明的各個實(shí)施例的結(jié)構(gòu)和操作以下參考附圖詳細(xì)描述。附圖中,相同的參考標(biāo)號指示相同或功能類似的元素。附圖簡述圖1示出了根據(jù)一個實(shí)施例可在其中使用多租戶數(shù)據(jù)庫系統(tǒng)(MTS)的環(huán)境。圖2根據(jù)一個實(shí)施例更詳細(xì)地示出了MTS的元素及其中的互連。圖3示出了根據(jù)本發(fā)明的一個實(shí)施例表示為標(biāo)準(zhǔn)主表和相關(guān)聯(lián)的自定義字段表的對象的示例。圖4示出了根據(jù)一個實(shí)施例表示為包含物理索引列320的自定義字段表310的自定義對象。圖5示出了根據(jù)一個實(shí)施例表示為自定義實(shí)體表的自定義對象的示例。圖6a示出了根據(jù)本發(fā)明的實(shí)施例的自定義字段定義元數(shù)據(jù)表。圖6b示出了根據(jù)本發(fā)明的實(shí)施例用于記錄為每一組織定義的每一自定義實(shí)體對象的名字和其它信息的元數(shù)據(jù)表。圖7示出了包含標(biāo)準(zhǔn)列和自定義字段列的標(biāo)準(zhǔn)實(shí)體表的示例,以及多個虛構(gòu)組織的實(shí)際數(shù)據(jù)值的示例。圖8示出了包括含有虛構(gòu)組織的數(shù)據(jù)值的自定義表的自定義實(shí)體對象的示例。發(fā)明的詳細(xì)描述圖1示出了可在其中使用多租戶數(shù)據(jù)庫系統(tǒng)的環(huán)境。如圖1中所示(且在圖2中更詳細(xì)示出),任何用戶系統(tǒng)12可經(jīng)由網(wǎng)絡(luò)14與多租戶數(shù)據(jù)庫系統(tǒng)(MTS)16交互。這些用戶系統(tǒng)12的用戶可以是處于不同容量(capacity)中的用戶,特定用戶系統(tǒng)12的容量可由當(dāng)前用戶完全確定。例如,在銷售員正使用特定的用戶系統(tǒng)12來與MTS16交互的情況下,該用戶系統(tǒng)具有分配給該銷售員的容量。然而,當(dāng)管理員使用該用戶系統(tǒng)與MTS16交互時,該用戶系統(tǒng)具有分配給該管理員的容量。網(wǎng)絡(luò)14可以是LAN(局字段網(wǎng))、WAN(廣字段網(wǎng))、無線網(wǎng)絡(luò)、點(diǎn)對點(diǎn)網(wǎng)絡(luò)、星形網(wǎng)絡(luò)、令牌環(huán)網(wǎng)絡(luò)、網(wǎng)絡(luò)集線器網(wǎng)絡(luò)或其它配置。當(dāng)前使用中最常見類型的網(wǎng)絡(luò)是TCP/IP(傳輸控制協(xié)議和互聯(lián)網(wǎng)協(xié)議)網(wǎng)絡(luò),諸如將在此處的眾多示例中使用的通常被稱為"Internet(因特網(wǎng))"(其中字母"I"大寫)的網(wǎng)絡(luò)的全球互聯(lián)網(wǎng),但應(yīng)理解,盡管TCP/IP是當(dāng)前較佳的協(xié)議,但本發(fā)明可使用的網(wǎng)絡(luò)不受此限制。用戶系統(tǒng)12可使用TCP/IP與MTS16通信,且在較高的網(wǎng)絡(luò)級處,使用諸如HTTP、FTP、AFS、WAP等其它常規(guī)的因特網(wǎng)協(xié)議來通信。作為示例,在使用HTTP的情況下,用戶系統(tǒng)12可包括常規(guī)被稱為"瀏覽器"的HTTP客戶端,它用于發(fā)送HTTP消息和從MTS16處的HTTP服務(wù)器接收HTTP消息。這樣的HTTP服務(wù)器可被實(shí)現(xiàn)為MTS16與網(wǎng)絡(luò)14之間的唯一網(wǎng)絡(luò)接口,但也可使用或替代使用其它技術(shù)。在某些實(shí)現(xiàn)中,MTS16與網(wǎng)絡(luò)14之間的接口包括負(fù)載共享功能,諸如在多個服務(wù)器之間平衡負(fù)載和平均地分配傳入的HTTP請求的循環(huán)HTTP請求分配器。較佳地,多個服務(wù)器中的每一個至少對于訪問該服務(wù)器的用戶能訪問MTS數(shù)據(jù)。在較佳的方面中,圖1中所示的系統(tǒng)實(shí)現(xiàn)基于web的顧客關(guān)系管理(CRM)系統(tǒng)。例如,在一個方面中,MTS16可包括被配置成實(shí)現(xiàn)并執(zhí)行CRM軟件應(yīng)用程序以及提供相關(guān)數(shù)據(jù)、代碼、表單、網(wǎng)頁和其它信息給用戶系統(tǒng)12并提供來自用戶系統(tǒng)12的這些信息,且將其存儲至數(shù)據(jù)庫系統(tǒng)相關(guān)數(shù)據(jù)、對象和網(wǎng)頁內(nèi)容中并從中檢索的應(yīng)用程序服務(wù)器。使用多租戶系統(tǒng),租戶數(shù)據(jù)較佳地被安排成使一個租戶的數(shù)據(jù)與其他租戶的數(shù)據(jù)分開保存,以使一個租戶不能訪問他人的數(shù)據(jù),除非該數(shù)據(jù)被明確共享。MTS16的元素的一種安排在圖1中示出,它包括網(wǎng)絡(luò)接口20、租戶數(shù)據(jù)的存儲22、MTS16以及可能的多個租戶可訪問的系統(tǒng)數(shù)據(jù)的存儲24、用于實(shí)現(xiàn)MTS16的各種功能的程序代碼26以及用于執(zhí)行MTS系統(tǒng)進(jìn)程和租戶專用進(jìn)程的進(jìn)程空間28,諸如作為應(yīng)用程序服務(wù)的一部分的運(yùn)行中的應(yīng)用程序。圖1中所示的系統(tǒng)中的若干元素包括不必在此詳細(xì)解釋的常規(guī)的、公知的元素。例如,每一用戶系統(tǒng)12可包括臺式個人計算機(jī)、工作站、膝上型計算機(jī)、PDA、手機(jī)或任何啟用WAP的設(shè)備或能夠直接或間接接口至因特網(wǎng)或其它網(wǎng)絡(luò)連接的任何其它計算設(shè)備。用戶系統(tǒng)12—般運(yùn)行HTTP客戶端,例如,瀏覽程序,諸如微軟的InternetExplorer瀏覽器、網(wǎng)景的Navigator瀏覽器、Opera的瀏覽器或在手機(jī)、PDA或其它無線設(shè)備的情況中的啟用WAP的瀏覽器等,從而允許用戶系統(tǒng)12的用戶(例如,CRM系統(tǒng)的訂戶)訪問、處理和查看從MTS16經(jīng)由網(wǎng)絡(luò)14向其提供的信息和頁面。每一用戶系統(tǒng)12—般也包括一個或多個用戶接口設(shè)備,諸如鍵盤、鼠標(biāo)、觸摸屏、筆等,用于與顯示器上(例如,監(jiān)視器屏幕、LCD顯示器等)由瀏覽器提供的圖形用戶界面(GUI)以及由MTS16或其它系統(tǒng)或服務(wù)器提供的頁面、表單和其它信息交互。如上所述,本發(fā)明適用于因特網(wǎng),因特網(wǎng)指的是網(wǎng)絡(luò)的專用全球互聯(lián)網(wǎng)。然而,應(yīng)理解,可使用其它網(wǎng)絡(luò)來代替因特網(wǎng),諸如內(nèi)聯(lián)網(wǎng)、外聯(lián)網(wǎng)、虛擬專用網(wǎng)(VPN)、非基于TCP/IP的網(wǎng)絡(luò)、任何LAN或WAN等。根據(jù)一個實(shí)施例,每一用戶系統(tǒng)12及其所有組件是使用諸如瀏覽器等應(yīng)用程序可配置的操作器,這些應(yīng)用程序包含使用諸如英特爾奔騰處理器等的中央處理單元運(yùn)行的計算機(jī)代碼。類似地,MTS16(以及存在一個以上的MTS的附加實(shí)例)及其所有組件可以是使用應(yīng)用程序可配置的操作器,這些應(yīng)用程序包含使用諸如英特爾奔騰處理器等一中央處理單元或多個處理器單元運(yùn)行的計算機(jī)代碼。用于操作和配置MTS16來與此處所述的網(wǎng)頁和其它數(shù)據(jù)以及媒體內(nèi)容互相通信并對其進(jìn)行處理的計算機(jī)代碼較佳地被下載和存儲在硬盤上,但整個程序代碼或其部分也可被存儲在所公知的任何其它易失性或非易失性存儲器介質(zhì)或設(shè)備中,諸如ROM或RAM,或在能夠存儲程序代碼的任何介質(zhì)上提供,諸如光盤(CD)介質(zhì)、數(shù)字多功能盤(DVD)介質(zhì)、軟盤等。另外,如公知的,整個程序代碼或其部分可例如經(jīng)由因特網(wǎng)從軟件源或從另一服務(wù)器中發(fā)送或下載,或經(jīng)由使用所公知的任何通信介質(zhì)和協(xié)議(例如,TCP/IP、HTTP、HTTPS、以太網(wǎng)等)的公知的任何其它常規(guī)網(wǎng)絡(luò)連接(例如,外聯(lián)網(wǎng)、VPN、LAN等)發(fā)送。可以理解,用于實(shí)現(xiàn)本發(fā)明的各方面的計算機(jī)代碼能以可在服務(wù)器或服務(wù)器系統(tǒng)上執(zhí)行的任何程序設(shè)計語言來實(shí)現(xiàn),諸如例如以C、C++、HTML、Java、JavaScript、諸如VBScript等任何其它腳本語言以及公知的眾多其它程序設(shè)計語言來實(shí)現(xiàn)。根據(jù)一個實(shí)施例,每一MTS16被配置成向用戶系統(tǒng)12提供網(wǎng)頁、表單、數(shù)據(jù)和媒體內(nèi)容,以支持作為MTS16的租戶的用戶系統(tǒng)12進(jìn)行的訪問。如此,除非數(shù)據(jù)被共享,否則MTS16提供安全機(jī)制來保持每一租戶的數(shù)據(jù)分開。如果使用一個以上MTS,它們可位于彼此靠近的位置(例如,在單幢建筑物或校園中的服務(wù)器場(serverfarm)中),或它們可分布在彼此遠(yuǎn)離的位置中(例如,位于城市A中的一個或多個服務(wù)器以及位于城市B中的一個或多個服務(wù)器)。如此處所使用的,每一MTS可包括本地或跨一個或多個地理位置分布的一個或多個邏輯和/或物理連接的服務(wù)器。此外,術(shù)語"服務(wù)器"旨在包含計算機(jī)系統(tǒng),它包括處理硬件和進(jìn)程空間、以及相關(guān)聯(lián)的存儲系統(tǒng)和本領(lǐng)字段中公知的數(shù)據(jù)庫應(yīng)用程序(例如,RDBMS)。也應(yīng)理解,"服務(wù)器系統(tǒng)"和"服務(wù)器"在此處通常可互換使用。類似地,此處所述的數(shù)據(jù)庫可被實(shí)現(xiàn)為單個數(shù)據(jù)庫、分布式數(shù)據(jù)庫、分布式數(shù)據(jù)庫的集合、具有冗余在線或離線備份或其它冗余的數(shù)據(jù)庫等,且可包含分布式數(shù)據(jù)庫或存儲網(wǎng)絡(luò)及相關(guān)聯(lián)的處理智能。圖2更詳細(xì)地示出了MTS16的各元素和各種互連。在此示例中,網(wǎng)絡(luò)接口被實(shí)現(xiàn)為一個或多個HTTP應(yīng)用程序服務(wù)器100。也示出了包含單獨(dú)的租戶進(jìn)程空間104的系統(tǒng)進(jìn)程空間102、系統(tǒng)數(shù)據(jù)庫106、租戶數(shù)據(jù)庫108和租戶管理進(jìn)程空間110。租戶數(shù)據(jù)庫108可被劃分成單獨(dú)的租戶存儲區(qū)112,這可以是物理排列或邏輯排列。在每一租戶存儲區(qū)112內(nèi),可為每一用戶類似地分配用戶存儲114。也應(yīng)理解,每一應(yīng)用程序服務(wù)器100可經(jīng)由不同的網(wǎng)絡(luò)連接通信地耦合至數(shù)據(jù)庫系統(tǒng),例如系統(tǒng)數(shù)據(jù)庫106和租戶數(shù)據(jù)庫108。例如,一個服務(wù)器100i可以經(jīng)由因特網(wǎng)14耦合,另一服務(wù)器lOON.i可經(jīng)由直接網(wǎng)絡(luò)連接耦合,而另一服務(wù)器100N可經(jīng)由又一不同的網(wǎng)絡(luò)連接耦合。傳輸控制協(xié)議和互聯(lián)網(wǎng)協(xié)議(TCP/IP)是用于在服務(wù)器100與數(shù)據(jù)庫系統(tǒng)之間通信的較佳的協(xié)議,然而對本領(lǐng)字段的技術(shù)人員顯然的是,取決于所使用的網(wǎng)絡(luò)互連,可使用其它傳輸協(xié)議來優(yōu)化系統(tǒng)。在較佳的方面中,每一應(yīng)用程序服務(wù)器100被配置成為任何用戶/組織處理請求。因?yàn)槠谕軌蛟谌魏螘r間為任何原因向服務(wù)器池添加應(yīng)用程序服務(wù)器或從中移除應(yīng)用程序服務(wù)器,較佳地不存在用戶和/或組織對特定應(yīng)用程序服務(wù)器100的任何服務(wù)器親和力(serveraffinity)。因此,在一個實(shí)施例中,實(shí)現(xiàn)負(fù)載平衡功能的接口系統(tǒng)(未示出)(例如,圖5的Big-IP負(fù)載平衡器)在服務(wù)器100與用戶系統(tǒng)12之間通信地耦合,以便向服務(wù)器100分發(fā)請求。在一個方面中,負(fù)載平衡器使用最少連接算法將用戶請求路由至服務(wù)器100。也可使用負(fù)載平衡算法的其它示例,諸如循環(huán)和觀察響應(yīng)時間。例如,在某些方面中,來自同一用戶的三個連續(xù)的請求可命中三個不同的服務(wù)器,且來自不同用戶的三個請求可命中同一服務(wù)器。以此方式,MTS16是多租戶的,其中MTS16處理跨不同用戶和組織的不同對象和數(shù)據(jù)的存儲。作為存儲的一個示例,一個租戶可以是雇傭銷售人員的公司,其中每一銷售員使用MTS16來管理他們的銷售過程。因此,用戶可維護(hù)聯(lián)系人數(shù)據(jù)、潛在顧客數(shù)據(jù)、顧客跟蹤數(shù)據(jù)、性能數(shù)據(jù)、目標(biāo)和進(jìn)展數(shù)據(jù)等,所有這些均適用于該用戶的個人銷售過程(例如,在租戶數(shù)據(jù)庫108中)。在較佳的MTS安排中,由于所有這些數(shù)據(jù)以及要訪問、查看、修改、報告、傳輸、計算等的應(yīng)用程序可由僅能夠進(jìn)行網(wǎng)絡(luò)訪問的用戶系統(tǒng)來維護(hù)和訪問,因此用戶可從眾多其它用戶系統(tǒng)中的任一個管理他或她的銷售成果和周期。例如,如果銷售員正拜訪顧客,且該顧客在他們的大廳里具有因特網(wǎng)接入,則銷售員在等待顧客到達(dá)大廳的同時可獲得關(guān)于該顧客的關(guān)鍵的更新。盡管每一用戶的銷售數(shù)據(jù)可以不論每一用戶的雇主為何而與其它用戶的銷售數(shù)據(jù)分開,但某些數(shù)據(jù)可以是組織范圍內(nèi)數(shù)據(jù)共享的,或可由多個用戶或作為租戶的給定組織的所有銷售人員訪問。因此,可能存在由MTS16管理在租戶級分配的某些數(shù)據(jù)結(jié)構(gòu),而其它數(shù)據(jù)結(jié)構(gòu)可在用戶級管理。因?yàn)镸TS可支持包含可能競爭者的多個租戶,因此MTS應(yīng)具有保持?jǐn)?shù)據(jù)、應(yīng)用程序和應(yīng)用程序使用分開的安全協(xié)議。而且,因?yàn)槎鄠€用戶可選擇訪問MTS而不是維護(hù)他們自己的系統(tǒng),因此冗余性、正常運(yùn)行時間和備份是更關(guān)鍵的功能并需要在MTS中實(shí)現(xiàn)。除用戶專用數(shù)據(jù)和租戶專用數(shù)據(jù)以外,MTS16也可維護(hù)可由多個租戶使用的系統(tǒng)級數(shù)據(jù)或其它數(shù)據(jù)。這樣的系統(tǒng)級數(shù)據(jù)可包括可在租戶之間共享的行業(yè)報告、新聞、告示等。在某些方面中,客戶機(jī)系統(tǒng)12與應(yīng)用程序服務(wù)器IOO通信來請求和更新來自MTS16的系統(tǒng)級和租戶級數(shù)據(jù),這可能需要對數(shù)據(jù)庫系統(tǒng)106和/或數(shù)據(jù)庫系統(tǒng)108的一個或多個查詢。MTS16(例如,MTS16中的應(yīng)用程序服務(wù)器100)自動生成被設(shè)計成訪問所需信息的一個或多個SQL語句(SQL查詢)。每一數(shù)據(jù)庫一般可看作包含符合預(yù)定義目錄的數(shù)據(jù)的對象的集合,諸如一組邏輯表。"表"是數(shù)據(jù)對象的一種表示,此處用來簡化根據(jù)本發(fā)明的對象和自定義對象的概念描述。應(yīng)理解,"表"和"對象"在此處可互換使用。每一表一般包含邏輯上以可查看模式排列成列或字段的一個或多個數(shù)據(jù)目錄。表的每一行或記錄包含由字段定義的每一目錄的數(shù)據(jù)的實(shí)例。例如,CRM數(shù)據(jù)庫可包括描述顧客的表,該表帶有諸如名字、地址、電話號碼、傳真號碼等基本聯(lián)系信息的字段。另一表可描述購買定單,包含諸如顧客、產(chǎn)品、銷售價格、日期等信息的字段。在某些多租戶數(shù)據(jù)庫系統(tǒng)中,可提供標(biāo)準(zhǔn)實(shí)體表。對CRM數(shù)據(jù)庫應(yīng)用,這樣的標(biāo)準(zhǔn)實(shí)體可包括帳戶、聯(lián)系人、潛在顧客和機(jī)會數(shù)據(jù)的表,每一張表包含預(yù)定義的字段。自定義字段根據(jù)一個實(shí)施例,對諸如標(biāo)準(zhǔn)實(shí)體的表的一張表,在物理模式中定義了附加的一組一列或多列,例如io、100或250列的文本數(shù)據(jù)。這些附加的列此處也被稱為自定義數(shù)據(jù)列、自定義字段列或自定義字段,它們允許系統(tǒng)管理員定義未包含在該實(shí)體的預(yù)定義標(biāo)準(zhǔn)字段中的附加的字段。這些自定義字段較佳地含有VARCHAR(變長字符)數(shù)據(jù)類型。在一個方面中,這些自定義字段較佳地存儲在來自主實(shí)體表的行之外,盡管這些字段可被存儲在主表中。例如,如果主表被稱為"sales.account",則自定義字段數(shù)據(jù)可以被存儲在被稱為"sales.account—cfdata"的表中,其中"Cf"代表"自定義字段"。這兩張表較佳地包含區(qū)分租戶行的organization一id列,以及在整個數(shù)據(jù)庫中標(biāo)識這些行的相同索引的主鍵(例如,在此情況中為帳戶id)。而且,這兩張表較佳地在DB(例如,OracleDB)上物理分區(qū)來促進(jìn)平行化,例如當(dāng)需要為維護(hù)目的而對整張表操作和需要維護(hù)較淺的索引時。圖3示出了表示為主表220和相關(guān)聯(lián)的自定義字段表210的對象的示例。在圖3中所示的特定示例中,主表200(.account)表示標(biāo)準(zhǔn)帳戶實(shí)體,自定義字段表210(.account—cfdata)包含由使用主表200的各個組織(租戶)定義的自定義字段。如圖所示,主表200包括組織ID("orgid")列201和用作表200的主鍵的表ID(例如,.accountid的"accid")列202。數(shù)據(jù)表200也包括多個數(shù)據(jù)列203。在圖3的特定示例中,其中表表示標(biāo)準(zhǔn)實(shí)體,數(shù)據(jù)列203是向可使用該表的各個組織提供的預(yù)定義數(shù)據(jù)列,即標(biāo)準(zhǔn)字段。在標(biāo)準(zhǔn)帳戶實(shí)體示例中,這樣的標(biāo)準(zhǔn)字段可包括名字列、地點(diǎn)列、多個雇員列以及可用于存儲帳戶相關(guān)信息的其它列。每一數(shù)據(jù)列203較佳地被定義為對每列存儲單個數(shù)據(jù)類型。提供orgid列201來區(qū)分使用多租戶帳戶表200的組織。如圖所示,N個不同的組織含有在表200中存儲的數(shù)據(jù)。歹U201中的orgid較佳為Char(15),但可包含其它數(shù)據(jù)類型。在一個方面中,orgid的前3個字符被置成預(yù)定義的前綴,諸如"00d",盡管如有需要,orgid中的字符的另一子集可用于保存這樣的前綴。自定義字段表210類似地包括orgid列211、表id列212和多個數(shù)據(jù)列213。如上所述,表id列212用作表210的主鍵,且較佳地包含與表200的表id列202相同的值。在所示的特定示例中,存在標(biāo)注為va10、vall.,.val249的250個數(shù)據(jù)列213。可以理解,按照期望的方式可使用任何其它編號,例如10或100。當(dāng)一開始創(chuàng)建組織并使其與數(shù)據(jù)庫表200相關(guān)聯(lián)時,對該組織自定義字段列213為空。然而,每當(dāng)在主表(例如帳戶)中創(chuàng)建記錄,即行時,在自定義字段表中創(chuàng)建相應(yīng)的行——所有的自定義字段列為NULL,從而直到使用之前不占用任何空間。在一個方面中,僅當(dāng)例如由組織的管理員定義該組織的新"列"時,才允許將數(shù)據(jù)輸入這些自定義字段中。例如,在帳戶實(shí)體示例中,可能期望特定組織來創(chuàng)建除標(biāo)準(zhǔn)字段203以外的一個或多個附加的自定義字段,來存儲在預(yù)定義標(biāo)準(zhǔn)字段中可能未說明的特定類型的數(shù)據(jù)。本發(fā)明有利地允許組織為這樣的數(shù)據(jù)創(chuàng)建附加的自定義列。該定義被存儲在元數(shù)據(jù)中,例如在可包含一個或多個元數(shù)據(jù)表的元數(shù)據(jù)目錄中,而非定義物理列(在Oracle中,其定義將被置于Oracle詞典式目錄中)。物理列的定義同樣可按照XML或某種其它格式存儲。圖6a示出了根據(jù)本發(fā)明的一個實(shí)施例的自定義字段定義元數(shù)據(jù)表500("custom—field—definition")的示例。custom_fidd—definition元數(shù)據(jù)表500被用于為每一組織定義的每一自定義字段列和表(例如,將在以下更詳細(xì)描述的標(biāo)準(zhǔn)表和自定義表)存儲名字、數(shù)據(jù)類型和其它信息。如圖所示,元數(shù)據(jù)表500包括custom—field—definition—id(自定義字段定義id)列510、organization—id(組織id)列520、tablenameorid(表名字或id)列530、fieldname(字段名)歹(J540、fielddatatype(字段數(shù)據(jù)類型)列550、is—indexed(是否索引)列560以及column_number(列號)列570。Organization—id列520存儲為其創(chuàng)建自定義字段的組織的orgid,custom—field—definition—id列是表500的主鍵。tablename列530存儲標(biāo)準(zhǔn)實(shí)體表的名字,諸如帳戶,或?yàn)榻M織創(chuàng)建的自定義實(shí)體表的id。fieldname列540存儲自定義字段的文本名,fielddatatype列550存儲該自定義字段的數(shù)據(jù)類型。數(shù)據(jù)類型的示例包括文本、數(shù)字、日期、參數(shù)選用表等。參數(shù)選用表數(shù)據(jù)類型是其中值從所枚舉的值列表中選擇值的文本字段。參數(shù)選用表一般顯示為UI中的下拉式菜單。isjndexed列560存儲指示字段是否被標(biāo)志為用于索引的值,這將在以下更詳細(xì)描述。在一個方面中,列560存儲布爾值。column—number列570存儲分配給自定義字段表210(圖3)中的自定義字段的列號(例如,"valO")。在應(yīng)用中創(chuàng)建新的自定義字段將分配自定義字段列213的其中之一來保存數(shù)據(jù)。在較佳方面中,最小編號的列被首先填入。例如,如圖3中所示,對每一組織首先填入"valO"歹U,然后是"vall"列,以此類推。從而,取決于由組織定義的自定義列的編號,每一自定義字段213可包含或可不包含該組織的數(shù)據(jù)?,F(xiàn)在,當(dāng)組織中的應(yīng)用程序的用戶編輯該表的行時,新的自定義字段出現(xiàn)在屏幕上(或經(jīng)由API出現(xiàn)),這將與其它標(biāo)準(zhǔn)字段一樣出現(xiàn)。然而,當(dāng)數(shù)據(jù)被持久保存在數(shù)據(jù)庫中時,該自定義字段的值被存儲在單獨(dú)的自定義字段表210的指定自定義字段列中,而非在標(biāo)準(zhǔn)主表200中。在一個方面中,對這些自定義字段允許多個虛擬數(shù)據(jù)類型,即使底層物理存儲可能是基于字符的。當(dāng)組織的系統(tǒng)管理員定義例如數(shù)字或日期自定義字段類型時,則值以允許容易轉(zhuǎn)換回邏輯數(shù)據(jù)類型的規(guī)范格式存儲為文本。如前所述,在一個方面中,較佳地使用VARCHAR的數(shù)據(jù)類型。例如,在該方面中,數(shù)據(jù)以YYYYMMDD格式存儲,這允許經(jīng)由TO—DATE(〈列、'YYYYMMDD,)函數(shù)轉(zhuǎn)換,并且也允許不經(jīng)任何轉(zhuǎn)換而進(jìn)行適當(dāng)?shù)呐判?。對?shù)字,使用通常的十進(jìn)制格式,并且可使用Oracle函數(shù)TO一NUMBER()來轉(zhuǎn)換回數(shù)字值,以便排序、數(shù)學(xué)運(yùn)算和過濾等。因?yàn)閿?shù)據(jù)庫是多租戶的,給定的物理自定義字段列可包含跨多個組織的數(shù)據(jù)。例如,因?yàn)榻M織不限于特定數(shù)據(jù)類型,因此一個組織可定義諸如日期的一種數(shù)據(jù)類型,而另一組織可定義諸如串或數(shù)字的不同的數(shù)據(jù)類型。從而可能在一個物理自定義字段列中找到串、數(shù)字和日期。圖3示出了包含不同數(shù)據(jù)類型的自定義字段列的示例。如例如"val0"自定義列中所示,由組織l定義的自定義列數(shù)據(jù)類型是數(shù)據(jù)類型l,由組織2定義的自定義列數(shù)據(jù)類型是數(shù)據(jù)類型2,而由組織N定義的自定義列數(shù)據(jù)類型是數(shù)據(jù)類型3。數(shù)據(jù)類型l、2和3可以是相同的,或它們可以不同。例如,數(shù)據(jù)類型l可以是文本,數(shù)據(jù)類型2可以是日期而數(shù)據(jù)類型3可以是數(shù)字。圖7及以下的相關(guān)討論示出了其中在自定義字段列中混合不同數(shù)據(jù)類型的示例。在一個方面中,為不同數(shù)據(jù)類型的自定義字段提供了單獨(dú)的列池,即單獨(dú)的池中的每一自定義字段列包含單個數(shù)據(jù)類型。在一個實(shí)施例中,使用元數(shù)據(jù)來確定給定自定義字段列中的數(shù)據(jù)類型。艮P,元數(shù)據(jù)被用于跟蹤每一自定義列中的每一組織的邏輯數(shù)據(jù)類型。在一個方面中,從元數(shù)據(jù)中創(chuàng)建映射函數(shù)。例如,當(dāng)組織為標(biāo)準(zhǔn)實(shí)體定義自定義字段時,在元數(shù)據(jù)表500中存儲了自定義字段定義,包括該組織的組織id、表名(例如,.account一cfdata)和自定義表中分配的列號(例如,va10)。以這種方式,給定列號、表名和組織id,可確定任何自定義列中的數(shù)據(jù)類型以供有效的數(shù)據(jù)檢索。自定義字段索引現(xiàn)在考慮索引這些自定義字段列(例如,列213)中的數(shù)據(jù)以便允許快速檢索的問題。例如,用戶期望將數(shù)據(jù)值過濾為日期,將數(shù)字值過濾為編號。然而,為了使這些過濾器能有效工作,給定用于轉(zhuǎn)換它們的值的上述表達(dá)式,需要對給定自定義字段列表中的每一組織的數(shù)據(jù)片施加函數(shù)索引(例如,OracleDB函數(shù)索引)。這從OracleDB觀點(diǎn)來看是不可能的,因?yàn)镺racleDB不理解一個物理列包含多個格式的數(shù)據(jù)。例如,如果試圖對以上TO一DATA或TO一NUMBER表達(dá)式創(chuàng)建索弓I,則由于在該物理列中的其它文本值不符合期望的格式而導(dǎo)致出錯。類似地,當(dāng)對串?dāng)?shù)據(jù)搜索時,用戶期望大小寫不敏感的搜索。即,搜索"car"應(yīng)找到"CAR"或"CaR"。然而,大小寫不敏感的定義是取決于語言的,而使用這樣的多租戶數(shù)據(jù)庫結(jié)構(gòu)的服務(wù)(例如,CRM服務(wù))可能啟用多語言。為對多語言的數(shù)據(jù)適當(dāng)搜索,需要使用利用Oracle中的各種NLS(自然語言標(biāo)準(zhǔn))函數(shù)建立的函數(shù)索引。由于給定的物理列可包含多種語言的數(shù)據(jù),有必要為所支持的每一語言建立N個不同的索引,這將導(dǎo)致不可量的解。鑒于以上列出的原因,在一個實(shí)施例中通過在單獨(dú)的一組索引列中對數(shù)據(jù)排序來實(shí)現(xiàn)這樣的"索引的自定義字段"。根據(jù)本發(fā)明的一個實(shí)施例,提供了多個附加的索引列以便允許索引自定義字段。當(dāng)自定義字段由數(shù)據(jù)庫管理員標(biāo)志用于索引時,多個索引列的其中之一被分配給該帶有標(biāo)志的列。來自帶有標(biāo)志的列的數(shù)據(jù)被復(fù)制給所分配的索引列。數(shù)據(jù)以便于搜索,例如日期和串的格式被存儲在索引列中。例如,YYYYMMDD本身是可搜索的格式,因?yàn)榘创烁袷降拇墒褂闷胀ù容^來進(jìn)行詞匯上的比較。圖4示出了根據(jù)一個實(shí)施例表示為包含物理索引列320的自定義字段表310的自定義對象的示例。在一個方面中,每一自定義字段數(shù)據(jù)表包含多個(例如,10、100、250等)例如使用標(biāo)準(zhǔn)Oracle8*樹索引的物理索引的列320。在具有10個索引的列的示例中,管理員從而可指定要索引的多達(dá)io個串或日期類型的自定義字段。當(dāng)自定義字段被標(biāo)志用于索引時,原始列中的數(shù)據(jù)(它們?nèi)耘f被維護(hù)以便當(dāng)需要時向用戶顯示未經(jīng)修改的格式)被復(fù)制到這些索引的列的其中之一。例如如圖4中所示,自定義數(shù)據(jù)字段"valO"由組織1的系統(tǒng)管理員標(biāo)志為索引的自定義列。來自該帶有標(biāo)志的列的數(shù)據(jù)被復(fù)制給索引列"ivalO"。類似地,自定義數(shù)據(jù)字段"vall"由組織2的系統(tǒng)管理員標(biāo)志為索引的自定義列,來自該帶有標(biāo)志的列的數(shù)據(jù)被復(fù)制到索引列"ivalO"。稍后,組織2的系統(tǒng)管理員可標(biāo)志另一自定義字段列,來自該列的數(shù)據(jù)被復(fù)制給另一索引列(例如,如圖4中所示,列"valO"的數(shù)據(jù)復(fù)制到列"ivall")。在一個方面中,類似于自定義字段,較佳地首先使用或填入最小編號的索引列。在一個方面中,為避免跨多種語言進(jìn)行搜索的問題,實(shí)現(xiàn)(例如,在應(yīng)用程序服務(wù)器中)將每一串自定義字段值轉(zhuǎn)換成通用大小寫不敏感格式的"大小寫折疊"算法。一種這樣的大小寫折疊算法是由UnicodeConsortium(統(tǒng)一代碼聯(lián)盟)在Unicode4.0標(biāo)準(zhǔn)3.13章一一CaselessMatching(http:〃www.unicode.org/versions/Unicode4.0.0/ch03.pdf)中定義的算法,它通過引用包含在此,這是對具有大小寫概念的所有語言將字符轉(zhuǎn)換成可獨(dú)立于大小寫進(jìn)行二元比較的形式的表式查找函數(shù)。無論何時搜索到原始自定義字段列中的值,SQL即改為在對正搜索的文字執(zhí)行相同的大小寫折疊操作之后對相應(yīng)的大小寫折疊的索引的列進(jìn)行過濾。數(shù)據(jù)不必從其YYYYMMDD格式修改,這些數(shù)據(jù)也作為文本包含在索引(未經(jīng)修改的)中。選擇不使用索引的自定義字段的組織則在這些字段中具有null值,而NULL在索引中不占用任何空間。以此方式,數(shù)據(jù)庫中空間僅當(dāng)實(shí)際索引自定義列時才被消耗。而且,索引列320較佳地被存儲在相應(yīng)的自定義字段表中,然而,它們可被存儲在行以外,在此情況中,較佳地orgid311和tableid312列被復(fù)制到單獨(dú)的索引的列表中以便于搜索。自定義字段唯一性另一期望的模式特征是唯一性約束概念。再一次,不能對自定義字段物理列施加唯一索引,因?yàn)楸M管值可能對一個組織是唯一的,但它們可能對共享該物理列的某些其它組織不唯一。例如,有可能兩個不同組織的兩條記錄具有存儲在同一自定義字段中的同一提取數(shù)據(jù)值。為實(shí)現(xiàn)該唯一性特征,在一個方面中,提供了僅包含要求唯一性的顧客的數(shù)據(jù)值的單獨(dú)的表。一旦組織管理員為唯一性而啟用了自定義字段,該組織的所有值被插入該唯一的索引表中,且對該自定義字段列的正在進(jìn)行的改變被同步更新到該唯一索引表(以下描述)。如果這些操作中的任一引起OracleDB唯一索引違反,則向最終用戶傳回該錯誤——管理員需要在聲明其唯一之前"清除"字段中的數(shù)據(jù)。唯一索引維護(hù)表的一種模式如下-1.organization—id(組織id)2.customfielddefinitionid(自定義字段定義id)3.customfieldvalue(自定義字段值)該模式允許索引來自同一組織(和實(shí)體)的多個自定義字段。前兩列較佳地以O(shè)racdDB唯一索引壓縮,這將使得物理索引較小,且該表可以是索引組織的,因?yàn)槠渥鳛楸淼奈ㄒ荒康氖怯米魑ㄒ凰饕?。自定義表期望為擴(kuò)展基本應(yīng)用或與其它系統(tǒng)集成的目的而創(chuàng)建全新的邏輯實(shí)體表(實(shí)體)。例如,使用由系統(tǒng)提供的標(biāo)準(zhǔn)實(shí)體的組織可期望創(chuàng)建一個或多個新實(shí)體來特別迎合該組織的特定企業(yè)模型且便于為該組織的特定企業(yè)模型進(jìn)行數(shù)據(jù)存儲和檢索。從而,本發(fā)明的一個實(shí)施例提供創(chuàng)建自定義實(shí)體表或自定義實(shí)體的功能。如同自定義字段的方法一樣,根據(jù)一個實(shí)施例,所有的自定義實(shí)體數(shù)據(jù)行被存儲在單個多租戶物理表中。然而,不同于標(biāo)準(zhǔn)自定義字段表,自定義實(shí)體數(shù)據(jù)表在一個方面中對每個組織包含多個邏輯表。顧客的多個"表"實(shí)際上存儲在一個大型表中,這對顧客是透明的。圖5示出了根據(jù)一個實(shí)施例表示為自定義實(shí)體表400的自定義對象的示例。表400包括orgid列401、customentityid(自定義實(shí)體id)列402和多個customfield(自定義字段)列403(標(biāo)記為"val0"、"vail"…)。也可提供多個可任選索引列420(標(biāo)記為"ival0"、"ivall")。orgid列被用于區(qū)分各個組織填充表400。例如,多個組織可創(chuàng)建自定義實(shí)體,一個方面中所有的自定義實(shí)體被存儲到表400。customentityid列402被用于區(qū)分存儲在表400中的各個自定義實(shí)體表。customentityid列402也用作表400的主鍵。customfield列403用于為由各個組織定義的各個自定義實(shí)體存儲數(shù)據(jù)。特別地,自定義字段列403存儲為由各個組織填充表400定義的各個自定義實(shí)體的每一個所定義的列。索引列420類似于以上參考圖4描述的自定義字段索引的列320來實(shí)現(xiàn)。根據(jù)一個實(shí)施例,全局唯一主鍵字段402的前3個字符被用于標(biāo)識具體實(shí)體類型。該技術(shù)有利地允許一個組織的多個自定義實(shí)體類型在該一個自定義實(shí)體表400中區(qū)分,如將在以下描述的。然而可以理解,可使用主鍵的少于或多于3個的字符來標(biāo)識實(shí)體,或者可使用主鍵的字符的任何子組合。當(dāng)組織管理員定義新的自定義實(shí)體時,該定義被存儲在元數(shù)據(jù)中而非底層數(shù)據(jù)詞典中。圖6b示出了根據(jù)本發(fā)明的實(shí)施例的自定義實(shí)體定義元數(shù)據(jù)表600("custom—entity—definition")的示例。當(dāng)定義新的自定義實(shí)體時,數(shù)據(jù)庫系統(tǒng)為該實(shí)體類型的行分配(該組織內(nèi))唯一的3字符前綴。一個方面中,選擇字母'a'作為所有自定義實(shí)體主鍵的第一個字符,例如如表400的列402中所示的a01...a02...a03...aMN...。如圖所示,跨所有組織,可重復(fù)使用該相同的3字符前綴。例如,重復(fù)使用"a01"作為多個組織的前綴。然而,自定義實(shí)體id的其余部分確保全局唯一性(且來自不同組織的數(shù)據(jù)永不混合)。在一個方面中,這些3字符id以基62編碼,因此每一初始字符允許每個組織62*62=3844個不同的自定義實(shí)體類型——這是對基本上所有的使用足夠大的數(shù)字。然而,應(yīng)理解可使用不同的編碼基來為每個組織提供更少或更多自定義實(shí)體類型。也應(yīng)理解,自定義實(shí)體id字段可以是合成主鍵,例如跨兩個或多個列,一個列用于前綴,其它列用于自定義實(shí)體id的其余部分。為簡單起見,在表400中未示出行分區(qū),然而示出了組織分區(qū)450和實(shí)體分區(qū)460。參考圖6b,使用custom—entity_definition元數(shù)據(jù)表600來記錄為每一組織所定義的每一自定義實(shí)體對象的名字和其它信息。如圖所示,元數(shù)據(jù)表600包括custom—entity—definition—id(自定義實(shí)體定義id)列610、organization—id(組織id)列620、entity—name(實(shí)體名)列630以及keyprefix(鍵前綴)列540。organization—id列620存儲對其創(chuàng)建自定義實(shí)體的組織的orgid,custom—entity—definition—id列610是表600的主鍵。entity—name列630存儲自定義實(shí)體表的名字,例如作為文本數(shù)據(jù)類型。keyprefix列640存儲為該實(shí)體類型的行分配的3字符前綴(例如,"a01"、"a02"等)。當(dāng)創(chuàng)建自定義實(shí)體表時,組織的管理員為自定義實(shí)體指定(組織內(nèi))唯一的開發(fā)員名字——這是用于標(biāo)識API調(diào)用的特定實(shí)體以及進(jìn)入系統(tǒng)的其它開發(fā)員入口點(diǎn)的名字。該名字存儲在表600的實(shí)體名列630中。自定義字段也可為自定義實(shí)體定義,如上所述,當(dāng)期望時,自定義字段可標(biāo)志用于索引。一旦為自定義實(shí)體定義了自定義字段,組織即可開始像任何其它標(biāo)準(zhǔn)實(shí)體一樣使用該自定義實(shí)體。例如,所有的API操作(例如,描述、插入、更新、刪除、査詢、搜索)均可用,且組織可定義用戶界面,用于在在線應(yīng)用程序中編輯該自定義實(shí)體。然而,.該自定義實(shí)體表對用戶和組織是透明的,它以及由該組織和其它組織定義的其它自定義實(shí)體表被存儲在單個自定義實(shí)體表400中。當(dāng)對自定義實(shí)體表操作時,SQL方面的一個不同是,除對組織id以外,還需對自定義實(shí)體id過濾來確保來自一個組織內(nèi)的多個邏輯實(shí)體類型的數(shù)據(jù)不混合在一起。例如,主鍵索引的前3字符部分(例如,a01…aMN)可用于這種有效的過濾。因此,對組織id和3字符前綴的過濾提供了對該組織的特定實(shí)體類型的判斷。類似地,應(yīng)向插入PL/SQL調(diào)用告知當(dāng)插入新主鍵值和自定義實(shí)體行時將使用哪個3字符前綴。類似于圖3的自定義字段列213,自定義字段列403可包含多個數(shù)據(jù)類型。例如,如圖所示,當(dāng)組織#1定義自定義實(shí)體表1(表400中由"a01"或orgl"00dl"標(biāo)識)時,具有數(shù)據(jù)類型1的自定義字段列定義可被分配給"val0"列。類似地,如圖所示,具有數(shù)據(jù)類型2的第二自定義實(shí)體表(由orgl的"a02"標(biāo)識)的自定義字段列定義可被分配給"val0"列。數(shù)據(jù)類型1和2可以相同或不同。以此方式,有可能可為由各個組織定義的各個自定義實(shí)體在自定義實(shí)體表400中的任何給定自定義字段列403中存儲眾多數(shù)據(jù)類型。從而,如上所述,使用可任選索引字段420,組織能夠標(biāo)志其自定義實(shí)體中的一個或多個列用于索引。過濾也可類似于上述方式進(jìn)行。在一個實(shí)施例中,當(dāng)創(chuàng)建自定義實(shí)體時,外鍵可定義為數(shù)據(jù)類型。以此方式,可提供與標(biāo)準(zhǔn)實(shí)體或另一自定義實(shí)體的關(guān)系,以便于數(shù)據(jù)存儲和檢索(例如,減少冗余數(shù)據(jù)存儲)。例如,當(dāng)定義自定義實(shí)體時,系統(tǒng)管理員可將自定義字段定義為外鍵數(shù)據(jù)類型,以建立與一個或多個其它實(shí)體的關(guān)系。相關(guān)實(shí)體的主鍵被復(fù)制并存儲在該自定義字段中。在一個方面中,提供多個列來存儲類型為外鍵的自定義字段。這些單獨(dú)的列可被索引。具體示例圖7示出了包含標(biāo)準(zhǔn)列703和自定義字段列713的標(biāo)準(zhǔn)實(shí)體表700的示例,以及多個組織的實(shí)際數(shù)據(jù)值的示例。如圖所示,標(biāo)準(zhǔn)表700表示具有標(biāo)準(zhǔn)name(名字)字段和其它標(biāo)準(zhǔn)字段703的帳戶實(shí)體。在此示例中,ABC公司(由orgid字段701中的"00dl"標(biāo)識)為"accountwebaddress(帳戶網(wǎng)址)"定義了自定義列,它被分配給val0列。該自定義字段的數(shù)據(jù)類型被定義為文本。此外,ABC公司為"accountstockprice(帳戶股票價格)"定義了第二自定義字段,它被分配給vall歹!],并為"accounttickersymbol(帳戶定單符號)"定義了第三自定義字段,它被分配給另一列。這些列的數(shù)據(jù)類型分別是數(shù)字和文本。類似地,123公司(由orgid字段701中的"00d2"標(biāo)識)和XYZ公司(由orgid字段701中的"00dN"標(biāo)識)各自分別為"accountnextannualmeetingdate(帳戶下一年會日期)"和"accountfiscalyear(帳戶財政年度)"定義了自定義字段。這些自定義字段的數(shù)據(jù)類型分別是日期和參數(shù)選用表。這些自定義字段均被分配給val0列,盡管它們的數(shù)據(jù)類型不同。如上所述,這些自定義字段的定義被存儲到例如元數(shù)據(jù)表500的元數(shù)據(jù)中。如圖所示,表700為ABC公司保存帳戶數(shù)據(jù),包括所示的"IBM"、"Ddl"和"Apple"的具體帳戶數(shù)據(jù)。類似地,表700也為123公司和XYZ公司保存帳戶數(shù)據(jù)。如圖所示,123公司和XYZ公司對具有相同名字"Disney"的帳戶各族具有特定條目。然而,這些條目基于全局唯一主鍵702(或712)區(qū)分。例如,對XYZ公司,"Disney"的帳戶條目具有主鍵值"001…932",而123公司的"Disney"俄帳戶條目具有主鍵值"001...87"。如上所述,va10自定義列中的數(shù)據(jù)值具有混合的數(shù)據(jù)類型。例如,對ABC公司,"webaddress"字段是文本,而123公司的"nextannualmeetingdate"字段具有日期數(shù)據(jù)類型,XYZ公司的"fiscalyear"字段具有參數(shù)選用表數(shù)據(jù)類型。圖8示出了包含ABC公司的自定義表810的自定義實(shí)體對象800的示例。如圖所示,ABC公司(由orgid列801中的"00dl"標(biāo)識)定義了表示資產(chǎn)的自定義對象810。資產(chǎn)對象810的定義被存儲到元數(shù)據(jù),例如表600中(圖6b)。資產(chǎn)對象810為customentityid(自定義實(shí)體id)分配了前綴"a02"。而且,如圖所示,ABC公司定義了另一自定義對象,例如在customentityid列802中由前綴"a01"標(biāo)識。可在表800中提供單獨(dú)的列來存儲表800中所存儲的各個對象的前綴(例如,"a01")。使用自定義外鍵列和各個數(shù)據(jù)列定義了資產(chǎn)對象810。自定義外鍵(FK)列被分配給"ValO"列,而"assetname(資產(chǎn)名)"、"assetvalue(資產(chǎn)值)"、"assetdepreciationtype(資產(chǎn)貶值類型)"禾Q"assetreplacementdate(資產(chǎn)重置曰期)"的數(shù)據(jù)字段被分別分配給列"Vail"到"Val4"。在此示例中,這些字段的數(shù)據(jù)類型分別為文本、數(shù)字、參數(shù)選用表和日期。資產(chǎn)對象810是帳戶對象700的子自定義對象。自定義外鍵列將對象810中的每一行連接至其父帳戶(在這些示例中,帳戶對象700為其tableid分配了前綴"001")。例如,外鍵值"001.,.9"連接至帳戶名"DELL"的表700中的行。類似地,外鍵值"001...8"和"001…10"分別連接至帳戶名"IBM"和"APPLE"的表700中的行。如圖所示,而且XYZ公司(由orgid列801中的"00dN"標(biāo)識)也定義了自定義對象來適應(yīng)其企業(yè)需求,該自定義對象也存儲在表800中。照此,任何給定的數(shù)據(jù)列803可包含取決于表800中所存儲的各個自定義對象的定義的混合的數(shù)據(jù)類型??芍赜梅?wù)自定義實(shí)體的一個目的不僅是支持?jǐn)?shù)據(jù)網(wǎng)格(例如,由組織和/顧客配置的行和列),而且也支持為標(biāo)準(zhǔn)實(shí)體展示的同一組應(yīng)用程序高級語義服務(wù)。這允許系統(tǒng)不僅作為在線數(shù)據(jù)提供者,而且作為具有復(fù)雜可重用服務(wù)的應(yīng)用程序構(gòu)建的基礎(chǔ)架構(gòu)。,參考salesforce.com服務(wù),這樣的可重用服務(wù)以及它們?nèi)绾螒?yīng)用于自定義實(shí)體的若干示例如下-歷史跟蹤salesforce.com中的標(biāo)準(zhǔn)實(shí)體(諸如范例和機(jī)會實(shí)體)支持對數(shù)據(jù)至記錄的改變進(jìn)行自動監(jiān)察。該監(jiān)察一般發(fā)生在應(yīng)用程序服務(wù)器中的較低級上,其中所有的數(shù)據(jù)正被寫入數(shù)據(jù)庫。該相同的代碼路徑較佳地與自定義實(shí)體一起使用。用于標(biāo)準(zhǔn)實(shí)體的相同的廣義模式也用于自定義實(shí)體——這是較佳的每行帶有一個字段增量的數(shù)據(jù)透視表(pivoted)模式1.organization—id2.customentitydataid(自定義實(shí)體數(shù)據(jù)id)3.customfielddefinitionid(自定義字段定義id)4.oldvalue(舊值)5.newvalue(新值)。然而,它可以是非數(shù)據(jù)透視表模式。非數(shù)據(jù)透視表模式對每一條單獨(dú)的信息具有多個列。它看上去像excel電子表IDNamePhoneEmailaddress111Craig555-1212foo@bar.com數(shù)據(jù)透視表模式使用普通列名,諸如IDPropertyNamePropertyValue111NameCraig111Phone555-1212111EmailAddressfoo@bar.com數(shù)據(jù)透視表模式其中具有多得多的行,但這些行更瘦(想象,如果存在50列數(shù)據(jù)——這將變成數(shù)據(jù)透視表模式中的50行,但數(shù)據(jù)透視表模式本身具有相同的列)。因此正常模式是短而寬的,而數(shù)據(jù)透視表模式是高而瘦的。數(shù)據(jù)透視表模式可用于例如監(jiān)察目的,諸如用于提供范例歷史相關(guān)列表——其中,向用戶示出每個字段值作為網(wǎng)格中的一行字段改變。然而,數(shù)據(jù)透視表模式一般難以用于如帶有個人的所有信息的細(xì)節(jié)屏幕的正常數(shù)據(jù)顯示。如果管理員在自定義實(shí)體和.自定義字段的定義中"開啟"該屬性,則其行為自動發(fā)生(改變被記錄到這一個多租戶監(jiān)察表中)。該普通歷史表中的數(shù)據(jù)可用于在在線應(yīng)用程序中或經(jīng)由API査詢顯示。作為示例,考慮對諸如范例等標(biāo)準(zhǔn)實(shí)體進(jìn)行的改變。系統(tǒng)可當(dāng)保存對范例的編輯時記錄以下歷史行Or。IdCaseIdFieldNameOldValueNswVslusDate00d15001SubjectProblemwithDiscdriveProblemwithDiscDrive3/4/0400d15001StatusOpenInProgress3/4/0400d15001PriorityLowMedium3/4/0400d15002StatusOpenClosed3/5/0400d15002RepN3me(cust0m)FrankSally3/5/04以上數(shù)據(jù)記錄了兩個編輯操作,一個是2004年3月4日對范例5001進(jìn)行的,另一個是2004年3月5日對范例5002進(jìn)行的。每次編輯若干個字段。作為另一示例,考慮對圖8的資產(chǎn)自定義對象810進(jìn)行的改變。2004年3月4日進(jìn)行的單個編輯操作的歷史跟蹤行的示例可能如下OrgIdCustEntIdFieldNameOldValueNewValueDate00d1a02AssetNameLaptopXLaptopY3/4/0400d1a02AssetValue50453/4/0400d1a02Deprec.TypeLinearAccelerated3/4/04所有的這些信息由系統(tǒng)自動記錄。用戶界面(UI)可呈現(xiàn)類似于以上示出或按照任何其它方便的格式的信息?;谠S可的安全和共享模型管理員可希望將訪問限于來自特定用戶配置文件的特定實(shí)體類型一一以具有諸如EDIT—ACCOUNT等許可的標(biāo)準(zhǔn)實(shí)體相同的方式。管理員可定義,給定的實(shí)體類型要求顯式的READ(讀)或EDIT(編輯)許可。普通profileCustomEntity(配置文件自定義實(shí)體)元數(shù)據(jù)表(可供經(jīng)由API編輯使用)允許創(chuàng)建使配置文件(讀訪問)與自定義實(shí)體類型相關(guān)聯(lián)的關(guān)系行,并可任選地聲明該配置文件中的用戶是否可編輯該實(shí)體類型的行。檢索和編輯自定義實(shí)體數(shù)據(jù)的公共應(yīng)用程序服務(wù)器和PL/SQL碼然后可為當(dāng)前用戶檢查該元數(shù)據(jù),并且如果用戶不具有適當(dāng)?shù)脑S可則拒絕操作。在一個方面中,共享模型允許對行的更細(xì)粒度的訪問——除以上許可檢査以外。管理員在定義自定義實(shí)體類型時,可選擇該實(shí)體類型是否可由所有用戶編輯(公有讀/寫)、對所有用戶只讀(公有讀/只讀)或者僅對記錄的所有者或被準(zhǔn)許對記錄的顯式共享訪問的用戶私有可用(私有)。為支持后面的共享模型,在一個方面中,向自定義實(shí)體數(shù)據(jù)表添加標(biāo)準(zhǔn)所有者字段,該字段在API中可用。附加到其它標(biāo)準(zhǔn)實(shí)體中的所有者字段的同一語義適用。例如,角色分層結(jié)構(gòu)中的經(jīng)理能訪問下屬擁有的所有記錄。而且,例如customEntityShare(自定義實(shí)體共享)等普通共享實(shí)體在一個方面中被用于進(jìn)入對用戶或組的特定自定義實(shí)體行的手動顯式共享訪問——以accountShare(賬戶共享)實(shí)體可供在API(和UI)中使用以便允許準(zhǔn)予顯式的帳戶訪問的相同方式。貨幣類型自定義實(shí)體中的一標(biāo)準(zhǔn)字段是控制該行中所有數(shù)字貨幣自定義字段的貨幣的單貨幣類型。該功能與所有標(biāo)準(zhǔn)實(shí)體一致,且允許與應(yīng)用程序中其它地方相同的貨幣兌換。每個實(shí)體類型多個商業(yè)處理標(biāo)準(zhǔn)實(shí)體允許多個"記錄類型"或商業(yè)處理的定義。例如,機(jī)會實(shí)體可具有電話銷售機(jī)會以及直接銷售機(jī)會兩者。取決于個別機(jī)會行的記錄類型,可供參數(shù)選用表字段使用的值按照組織管理員配置的方式改變。自定義實(shí)體允許管理員對該同一元數(shù)據(jù)的指定。該實(shí)體中的參數(shù)選用表自定義字段較佳地以字段標(biāo)準(zhǔn)實(shí)體相同的方式作用。工作流程在一個方面中,本發(fā)明提供對觸發(fā)條件的定義和對特定實(shí)體類型的動作。例如,如果機(jī)會量超過特定值(觸發(fā)條件),則諸如電子郵件等通知被發(fā)送(動作)給預(yù)先指定的個人或組,例如該組織的銷售副主管。再一次,內(nèi)部用來定義這些規(guī)則的元數(shù)據(jù)較佳地以類似于對標(biāo)準(zhǔn)實(shí)體的方式對自定義實(shí)體操作。例如在應(yīng)用程序服務(wù)器或數(shù)據(jù)庫服務(wù)器中執(zhí)行的代碼為每一行編輯評估這些條件,它們在較低級出現(xiàn),其中標(biāo)準(zhǔn)和自定義實(shí)體均能夠利用該功能。盡管經(jīng)由示例并按照特定實(shí)施例描述了本發(fā)明,但可理解本發(fā)明不限于所公開的實(shí)施例。相反,如對本領(lǐng)字段的技術(shù)人員而言,顯然它旨在覆蓋各種修改和類似的安排。從而,所附權(quán)利要求書的范圍應(yīng)與最寬泛的解釋一致,以便包含所有這樣的修改和類似的安排。權(quán)利要求1.一種在單個多租戶數(shù)據(jù)結(jié)構(gòu)中為多個租戶存儲多個字段的計算機(jī)實(shí)現(xiàn)的方法,包括定義具有多個數(shù)據(jù)列和一個或多個索引列的多租戶數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一數(shù)據(jù)字段,所述第一字段具有第一數(shù)據(jù)類型;為第二租戶定義第二數(shù)據(jù)字段,所述第二字段具有第二數(shù)據(jù)類型,其中所述第二數(shù)據(jù)類型不同于所述第一數(shù)據(jù)類型;當(dāng)在所述第一和第二字段中具有數(shù)據(jù)值的記錄由所述第一和第二租戶創(chuàng)建時,將所述第一和第二字段的數(shù)據(jù)值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個列中,其中所述單個列包括數(shù)據(jù)值,所述數(shù)據(jù)值對不同租戶具有不同數(shù)據(jù)類型;以及響應(yīng)于來自所述第一租戶的在所述第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求,將所述單個數(shù)據(jù)列中為所述第一字段存儲的數(shù)據(jù)值復(fù)制到所述索引列的第一個中。2.如權(quán)利要求l所述的方法,其特征在于,還包括-定義具有一個或多個列的單獨(dú)的數(shù)據(jù)結(jié)構(gòu);以及響應(yīng)于來自所述第一租戶和所述第二租戶的、分別關(guān)于所述第一數(shù)據(jù)字段或第二數(shù)據(jù)字段中的數(shù)據(jù)為唯一的指示,將分別對應(yīng)于所述第一數(shù)據(jù)字段或第二數(shù)據(jù)字段的存儲在所述單個數(shù)據(jù)列中的數(shù)據(jù)值復(fù)制到所述單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中。3.如權(quán)利要求l所述的方法,其特征在于,所述復(fù)制包括將所復(fù)制的數(shù)據(jù)值轉(zhuǎn)換成經(jīng)修改的格式。4.如權(quán)利要求3所述的方法,其特征在于,所述轉(zhuǎn)換包括對所述數(shù)據(jù)值應(yīng)用大小寫折疊算法。5.—種在單個多租戶數(shù)據(jù)結(jié)構(gòu)中為一個或多個組織容納多個表的計算機(jī)實(shí)現(xiàn)的方法,包括定義含有主鍵列、組織id列和多個數(shù)據(jù)列的多租戶數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一表,所述第一表具有第一數(shù)據(jù)字段,且所述第一租戶具有第-一租戶id;將第一表id分配給所述第一表;為第二租戶定義第二表,所述第二表具有第二數(shù)據(jù)字段,且所述第二租戶具有第二租戶id;將第二表id分配給所述第二表;其中當(dāng)由所述第一租戶為所述第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第一數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第一租戶id存儲到所述組織id列;并且C)將所述第一表id存儲到所述主鍵列;以及其中當(dāng)由所述第二租戶為所述第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第二數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第二租戶id存儲到所述組織id列;并且C)將所述第二表id存儲到所述主鍵列;以及其中所述第一和第二租戶的第一和第二表被存儲到所述數(shù)據(jù)結(jié)構(gòu)中。6.如權(quán)利要求5所述的方法,其特征在于,所述數(shù)據(jù)結(jié)構(gòu)包括一個或多個索引列,所述方法還包括響應(yīng)于來自所述第一租戶的在所述第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求,將所述單個數(shù)據(jù)列中為所述第一表存儲的數(shù)據(jù)值復(fù)制到所述索引列的第一個中。7.如權(quán)利要求6所述的方法,其特征在于,所述復(fù)制包括基于所述第一租戶id、所述第一表id和所述第一數(shù)據(jù)字段標(biāo)識要被復(fù)制的數(shù)據(jù)值。8.如權(quán)利要求5所述的方法,其特征在于,所述第一數(shù)據(jù)字段具有第一數(shù)據(jù)類型,且所述第二數(shù)據(jù)字段具有不同于所述第一數(shù)據(jù)類型的第二數(shù)據(jù)類型,使得所述單個數(shù)據(jù)列包括具有所述第一和第二數(shù)據(jù)類型的數(shù)據(jù)值。9.一種用于在單個數(shù)據(jù)結(jié)構(gòu)中為一個或多個租戶存儲多個表的計算機(jī)實(shí)現(xiàn)的方法,包括定義具有主鍵列、組織id列和多個數(shù)據(jù)列的數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一表,所述第一表具有第一數(shù)據(jù)字段,所述第一數(shù)據(jù)字段具有第一數(shù)據(jù)類型,且所述第一租戶具有第一租戶id;將第一表id分配給所述第一表;為所述第一租戶定義第二表,所述第二表具有第二數(shù)據(jù)字段,所述第二數(shù)據(jù)字段具有不同于所述第一數(shù)據(jù)類型的第二數(shù)據(jù)類型;將第二表id分配給所述第二表;其中當(dāng)為所述第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第一數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第一租戶id存儲到所述組織id列;并且C)將所述第一表id存儲到所述主鍵列;以及其中當(dāng)為第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第二數(shù)據(jù)字段的值存儲到所述單個數(shù)據(jù)列;b)將所述第一租戶id存儲到所述組織id列;并且C)將所述第二表id存儲到所述主鍵列;其中所述第一租戶的所述第一和第二表被存儲到所述數(shù)據(jù)結(jié)構(gòu)中,且其中所述單個數(shù)據(jù)列包括具有所述第一和第二數(shù)據(jù)類型的數(shù)據(jù)值。10.如權(quán)利要求9所述的方法,其特征在于,還包括為第二租戶定義第三表,所述第三表具有第三數(shù)據(jù)字段,所述第三數(shù)據(jù)字段具有第三數(shù)據(jù)類型,且所述第二租戶具有第二租戶id;以及將第三表id分配給所述第三表;其中當(dāng)為所述第三表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄將所述第三數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的所述單個數(shù)據(jù)列中;將所述第二租戶id存儲到所述組織id列中;以及將所述第三表id存儲到所述主鍵列中;其中所述第一、第二和第三表存儲在所述數(shù)據(jù)結(jié)構(gòu)中,且其中所述單個數(shù)據(jù)列包括具有所述第一和第二數(shù)據(jù)類型和所述第三數(shù)據(jù)類型的數(shù)據(jù)值。11.如權(quán)利要求9所述的方法,其特征在于,所述第一和第二表id是不同的。12.如權(quán)利要求IO所述的方法,其特征在于,所述第一和第二表id是不同的,且所述第三表id與所述第一和第二表id的其中之一相同。13.如權(quán)利要求9所述的方法,其特征在于,所述數(shù)據(jù)結(jié)構(gòu)包括一個或多個索引列,所述方法還包括響應(yīng)于來自所述第一租戶的在所述第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求,將所述單個數(shù)據(jù)列中為所述第一表存儲的數(shù)據(jù)值復(fù)制到所述索引列的第一個中。14.如權(quán)利要求13所述的方法,其特征在于,所述復(fù)制包括將所復(fù)制的數(shù)據(jù)值轉(zhuǎn)換成經(jīng)修改的格式。15.如權(quán)利要求14所述的方法,其特征在于,所述轉(zhuǎn)換包括對所述數(shù)據(jù)值應(yīng)用大小寫折疊算法。16.如權(quán)利要求9所述的方法,其特征在于,所述第三數(shù)據(jù)類型是從由所述第一數(shù)據(jù)類型、所述第二數(shù)據(jù)類型和不同于所述第一和第二數(shù)據(jù)類型的數(shù)據(jù)類型組成的組中選擇的。17.如權(quán)利要求9所述的方法,其特征在于,當(dāng)所述第一租戶為所述第一表創(chuàng)建記錄時,執(zhí)行過程來判斷所述記錄的所述第一數(shù)據(jù)字段中的數(shù)據(jù)值是否滿足閾值條件,如果滿足,則處理動作規(guī)則。18.如權(quán)利要求17所述的方法,其特征在于,所述動作規(guī)則指示通知的接收方,所述方法還包括自動向所述接收方發(fā)送通知消息。19.如權(quán)利要求9所述的方法,其特征在于,還包括為所述第一數(shù)據(jù)表定義所有者字段,其中存儲在所述所有者字段中的每一數(shù)據(jù)值指示對相關(guān)聯(lián)的記錄的分層結(jié)構(gòu)用戶訪問級別。20.—種存儲用于控制數(shù)據(jù)庫以便在單個多租戶數(shù)據(jù)結(jié)構(gòu)中為多個租戶存儲多個字段的代碼的計算機(jī)可讀介質(zhì),所述代碼包含指令,用于-定義具有多個數(shù)據(jù)列和一個或多個索引列的多租戶數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一數(shù)據(jù)字段,所述第一字段具有第一數(shù)據(jù)類型;為第二租戶定義第二數(shù)據(jù)字段,所述第二字段具有第二數(shù)據(jù)類型,其中所述第二數(shù)據(jù)類型不同于所述第一數(shù)據(jù)類型;當(dāng)在所述第一和第二字段中具有數(shù)據(jù)值的記錄由所述第一和第二租戶創(chuàng)建時,將所述第一和第二字段的數(shù)據(jù)值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個列中,其中所述單個列包含數(shù)據(jù)值,所述數(shù)據(jù)值對不同租戶具有不同數(shù)據(jù)類型;以及響應(yīng)于來自所述第一租戶的在所述第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求,將所述單個數(shù)據(jù)列中為所述第一字段存儲的數(shù)據(jù)值復(fù)制到所述索引列的第一個中。21.—種存儲用于控制數(shù)據(jù)庫以便在單個多租戶數(shù)據(jù)結(jié)構(gòu)中為多個租戶存儲多個字段的代碼的計算機(jī)可讀介質(zhì),所述代碼包含指令,用于定義含有主鍵列、組織id列和多個數(shù)據(jù)列的多租戶數(shù)據(jù)結(jié)構(gòu);為第一租戶定義第一表,所述第一表具有第一數(shù)據(jù)字段,且所述第一租戶具有第一租戶id;將第一表id分配給所述第一表;為第二租戶定義第二表,所述第二表具有第二數(shù)據(jù)字段,且所述第二租戶具有第二租戶id;將第二表id分配給所述第二表;其中當(dāng)由所述第一租戶為所述第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第一數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第一租戶id存儲到所述組織id列;并且C)將所述第一表id存儲到所述主鍵列;以及其中當(dāng)由所述第二租戶為所述第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第二數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第二租戶id存儲到所述組織id列;并且C)將所述第二表id存儲到所述主鍵列;以及其中所述第一和第二租戶的第一和第二表被存儲到所述數(shù)據(jù)結(jié)構(gòu)中。22.—種多租戶數(shù)據(jù)庫系統(tǒng),包括用于存儲多租戶數(shù)據(jù)對象的數(shù)據(jù)庫;以及數(shù)據(jù)庫管理進(jìn)程,它被配置成在所述數(shù)據(jù)庫中定義多租戶數(shù)據(jù)結(jié)構(gòu),所述數(shù)據(jù)結(jié)構(gòu)具有多個數(shù)據(jù)列和一個或多個索引列;為第一租戶定義第一數(shù)據(jù)字段,所述第一字段具有第一數(shù)據(jù)類型;為第二租戶定義第二數(shù)據(jù)字段,所述第二字段具有第二數(shù)據(jù)類型,其中所述第二數(shù)據(jù)類型不同于所述第一數(shù)據(jù)類型;當(dāng)在所述第一和第二字段中具有數(shù)據(jù)值的記錄由所述第一和第二租戶創(chuàng)建時,將所述第一和第二字段的數(shù)據(jù)值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個列中,其中所述單個列包含數(shù)據(jù)值,所述數(shù)據(jù)值對不同租戶具有不同數(shù)據(jù)類型;以及響應(yīng)于來自所述第一租戶的在所述第一數(shù)據(jù)字段中索引數(shù)據(jù)的請求,將所述單個數(shù)據(jù)列中為所述第一字段存儲的數(shù)據(jù)值復(fù)制到所述索引列的第一個中。23.—種多租戶數(shù)據(jù)庫系統(tǒng),包括用于存儲多租戶數(shù)據(jù)對象的數(shù)據(jù)庫;以及數(shù)據(jù)庫管理進(jìn)程,它被配置成在所述數(shù)據(jù)庫中定義多租戶數(shù)據(jù)結(jié)構(gòu),其中所述數(shù)據(jù)結(jié)構(gòu)具有主鍵列、組織id列和多個數(shù)據(jù)列;為第一租戶定義第一表,所述第一表具有第一數(shù)據(jù)字段,且所述第一租戶具有第一租戶id;將第一表id分配給所述第一表;為第二租戶定義第二表,所述第二表具有第二數(shù)據(jù)字段,且所述第二租戶具有第二租戶id;將第二表id分配給所述第二表;其中當(dāng)由所述第一租戶為所述第一表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄a)將所述第一數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第一租戶id存儲到所述組織id列;并且C)將所述第一表id存儲到所述主鍵列;以及其中當(dāng)由所述第二租戶為所述第二表創(chuàng)建記錄時,對所創(chuàng)建的每一記錄:a)將所述第二數(shù)據(jù)字段的值存儲到所述數(shù)據(jù)結(jié)構(gòu)中的單個數(shù)據(jù)列;b)將所述第二租戶id存儲到所述組織id列;并且C)將所述第二表id存儲到所述主鍵列;以及其中所述第一和第二租戶的第一和第二表被存儲到所述數(shù)據(jù)結(jié)構(gòu)中。全文摘要用于在固定物理數(shù)據(jù)庫模式中容納諸如動態(tài)表和列等可變模式數(shù)據(jù)的系統(tǒng)和方法。提供了諸如表的標(biāo)準(zhǔn)對象以供多個租戶或組織在多租戶數(shù)據(jù)庫系統(tǒng)(201)中使用。每一組織可添加或定義自定義字段以包含在標(biāo)準(zhǔn)對象(203)中。多租戶的自定義字段被存儲在對象數(shù)據(jù)結(jié)構(gòu)內(nèi)的單個字段中,且該單個字段可對每一租戶(213)包含不同的數(shù)據(jù)類型。還提供了索引列,其中租戶可指定用于索引的字段。指定字段的數(shù)據(jù)值被復(fù)制到索引列中,每一索引列可包含多種數(shù)據(jù)類型(210)。每一組織也可定義包含自定義字段和索引列(201)的自定義對象。多個租戶的自定義對象被存儲在單個自定義對象數(shù)據(jù)結(jié)構(gòu)中。單個自定義對象表的主鍵值是全局唯一的,但也可包括可在不同實(shí)體中重用的對象專用標(biāo)識符。文檔編號G06F17/30GK101120337SQ200580009510公開日2008年2月6日申請日期2005年3月31日優(yōu)先權(quán)日2004年4月2日發(fā)明者C·韋斯曼,S·翁申請人:易享信息技術(shù)(上海)有限公司