多租户数据库系统中的自定义实体和字段的制作方法

文档序号:6655404阅读:520来源:国知局

专利名称::多租户数据库系统中的自定义实体和字段的制作方法多租户数据库系统中的自定义实体和字段发明背景本发明一般涉及多租户数据库,尤其涉及用于在多租户数据库系统中创建诸如自定义实体和字段等自定义对象的系统和方法。在多租户数据库系统,诸如salesforce.com服务中,使用了多租户体系结构,其中顾客组织(即,租户)共享一个逻辑数据库中的数据库资源。数据库表本身一般是共享的;数据模型中的每一实体一般包含为每一租户区分行的organization—id(组织id)列。在此(被索引的)organizationjd列上的租户过滤器的上下文中的所有的查询和数据处理用于确保适当的安全性和虚拟专用数据库的外观。例如在salesforce.com系统中,该策略被用来向顾客展示诸如」ccow"f(账户)、Cowto"(联系人)、lead(潜在顾客)和C^ortwm'0;(机遇)实体等的标准实体。然而,顾客可能希望向数据库系统添加除标准应用配备的标准实体和字段以外的他们自己的自定义数据。在传统的客户机/服务器应用中,其中顾客具有其自己的物理数据库,自定义数据的添加通常是经由针对该数据库的DDL(数据定义语言)来完成的,以创建新的物理模式——表和列。在在线多租户数据库系统,诸如salesforce.com服务中,由于各种原因该方法可能是无法维持的。例如,对具有大量租户(例如,1,000或10,000或更多租户的数量级)的数据库系统,所有期望的模式的联合将淹没底层数据词典式目录(例如,Oracle词典)。此外,维护所有这些模式对象将是DBA(数据库管理员)的几乎不可能的负担。此外,当前的关系型数据库不能足够良好地支持在线DDL(在高度并发事务系统中)以便组织能维持逻辑独立。具体地,一个组织进行的模式创建将对引起不可接受的延迟的所有其它顾客锁定应用。从而,期望提供一种系统和方法,它们提供在固定物理模式中存储可变模式数据以便克服以上和其它问题的方法。发明简述本发明提供用于在固定物理数据库模式中容纳诸如动态表和列等可变模式数据的新颖的系统和方法。根据本发明,提供诸如表等标准对象以供多个租户或组织使用。每一组织可添加或定义自定义字段以包含在标准对象中。在一个方面,多租户的自定义字段被存储在对象数据结构内的单个字段中,且该单个字段可对每一租户包含不同的数据类型。还提供了索引列,其中租户可指定用于索引的字段。指定字段的数据值被复制到索引列中,每一索引列可包含多种数据类型。每一组织也可定义包含自定义字段和索引列的自定义对象。在一个方面,多个租户的自定义对象被存储在单个自定义对象数据结构中。单个自定义对象表的主键值是全局唯一的,但也可包括可在不同实体中重用的对象专用标识符。根据本发明的一方面,提供了一种用于在单个多租户数据结构中存储多个租户的多个字段的计算机实现的方法。该方法一般包括定义具有多个数据列和一个或多个索引列的多租户数据结构,为第一租户定义第一数据字段,所述第一字段具有第一数据类型;以及为第二租户定义第二数据字段,所述第二字段具有第二数据类型,其中第二数据类型不同于所述第一数据类型。该方法一般还包括当所述第一和第二字段中具有数据值的记录由所述第一和第二租户创建时将第一和第二字段的数据值存储到数据结构中的单个列中,其中该单个列对不同租户包含具有不同数据类型的数据值;以及响应于来自第一租户的在第一数据字段中索引数据的请求将单个数据列中为第一字段存储的数据值复制到索引列的第一个中。根据本发明的另一方面,提供了一种用于在单个多租户数据结构中容纳一个或多个组织的多个表的计算机实现的方法。该方法一般包括定义含有主键列、组织id列和多个物理数据列的多租户数据结构;为第一租户定义第一表,该第一表具有第一数据字段且第一租户具有第一租户id;将第一表id分配给第一表;为第二租户定义第二表,该第二表具有第二数据字段且第二租户具有第二租户id;以及将第二表id分配给第二表。当由第一租户为第一表创建记录时,对所创建的每一记录,该方法一般包括将第一数据字段的值存储到该数据结构中的单个数据列,将第一租户id存储到组织id列,并将第一表id存储到主键列。当由第二租户为第二表创建记录时,对所创建的每一记录,该方法一般包括将第二数据字段的值存储到数据结构中的单个数据列,将第二租户id存储到组织id列,并将第二表id存储到主键列,其中第一和第二租户的第一和第二表被存储到该数据结构中。根据本发明的又一方面,提供了一种用于在单个数据结构中为一个或多个租户存储多个表的计算机实现的方法。该方法一般包括定义具有主键列、组织id列和多个数据列的数据结构;为第一租户定义第一表,该第一表具有第一数据字段,该第一数据字段具有第一数据类型,且第一租户具有第一租户id;将第一表id分配给第一表;为第一租户定义第二表,该第二表具有第二数据字段,该第二数据字段具有不同于第一数据类型的第二数据类型;以及将第二表id分配给第二表。当.为第一表创建记录时,对所创建的每一记录,该方法一般包括将第一数据字段的值存储到数据结构中的单个数据列,将第一租户id存储到组织id列,并将第一表id存储到主键列。当为第二表创建记录时,对所创建的每一记录,该方法一般包括将第二数据字段的值存储到单个数据列,将第一租户id存储到组织id列,并将第二表id存储到主键列,其中第一租户的第一和第二表被存储到数据结构中,且其中所述单个数据列包括具有所述第一和第二数据类型的数据值。参考说明书的其余部分,包括附图和权利要求书,将理解本发明的其它特征和优点。本发明的其它特征和优点以及本发明的各个实施例的结构和操作以下参考附图详细描述。附图中,相同的参考标号指示相同或功能类似的元素。附图简述图1示出了根据一个实施例可在其中使用多租户数据库系统(MTS)的环境。图2根据一个实施例更详细地示出了MTS的元素及其中的互连。图3示出了根据本发明的一个实施例表示为标准主表和相关联的自定义字段表的对象的示例。图4示出了根据一个实施例表示为包含物理索引列320的自定义字段表310的自定义对象。图5示出了根据一个实施例表示为自定义实体表的自定义对象的示例。图6a示出了根据本发明的实施例的自定义字段定义元数据表。图6b示出了根据本发明的实施例用于记录为每一组织定义的每一自定义实体对象的名字和其它信息的元数据表。图7示出了包含标准列和自定义字段列的标准实体表的示例,以及多个虚构组织的实际数据值的示例。图8示出了包括含有虚构组织的数据值的自定义表的自定义实体对象的示例。发明的详细描述图1示出了可在其中使用多租户数据库系统的环境。如图1中所示(且在图2中更详细示出),任何用户系统12可经由网络14与多租户数据库系统(MTS)16交互。这些用户系统12的用户可以是处于不同容量(capacity)中的用户,特定用户系统12的容量可由当前用户完全确定。例如,在销售员正使用特定的用户系统12来与MTS16交互的情况下,该用户系统具有分配给该销售员的容量。然而,当管理员使用该用户系统与MTS16交互时,该用户系统具有分配给该管理员的容量。网络14可以是LAN(局字段网)、WAN(广字段网)、无线网络、点对点网络、星形网络、令牌环网络、网络集线器网络或其它配置。当前使用中最常见类型的网络是TCP/IP(传输控制协议和互联网协议)网络,诸如将在此处的众多示例中使用的通常被称为"Internet(因特网)"(其中字母"I"大写)的网络的全球互联网,但应理解,尽管TCP/IP是当前较佳的协议,但本发明可使用的网络不受此限制。用户系统12可使用TCP/IP与MTS16通信,且在较高的网络级处,使用诸如HTTP、FTP、AFS、WAP等其它常规的因特网协议来通信。作为示例,在使用HTTP的情况下,用户系统12可包括常规被称为"浏览器"的HTTP客户端,它用于发送HTTP消息和从MTS16处的HTTP服务器接收HTTP消息。这样的HTTP服务器可被实现为MTS16与网络14之间的唯一网络接口,但也可使用或替代使用其它技术。在某些实现中,MTS16与网络14之间的接口包括负载共享功能,诸如在多个服务器之间平衡负载和平均地分配传入的HTTP请求的循环HTTP请求分配器。较佳地,多个服务器中的每一个至少对于访问该服务器的用户能访问MTS数据。在较佳的方面中,图1中所示的系统实现基于web的顾客关系管理(CRM)系统。例如,在一个方面中,MTS16可包括被配置成实现并执行CRM软件应用程序以及提供相关数据、代码、表单、网页和其它信息给用户系统12并提供来自用户系统12的这些信息,且将其存储至数据库系统相关数据、对象和网页内容中并从中检索的应用程序服务器。使用多租户系统,租户数据较佳地被安排成使一个租户的数据与其他租户的数据分开保存,以使一个租户不能访问他人的数据,除非该数据被明确共享。MTS16的元素的一种安排在图1中示出,它包括网络接口20、租户数据的存储22、MTS16以及可能的多个租户可访问的系统数据的存储24、用于实现MTS16的各种功能的程序代码26以及用于执行MTS系统进程和租户专用进程的进程空间28,诸如作为应用程序服务的一部分的运行中的应用程序。图1中所示的系统中的若干元素包括不必在此详细解释的常规的、公知的元素。例如,每一用户系统12可包括台式个人计算机、工作站、膝上型计算机、PDA、手机或任何启用WAP的设备或能够直接或间接接口至因特网或其它网络连接的任何其它计算设备。用户系统12—般运行HTTP客户端,例如,浏览程序,诸如微软的InternetExplorer浏览器、网景的Navigator浏览器、Opera的浏览器或在手机、PDA或其它无线设备的情况中的启用WAP的浏览器等,从而允许用户系统12的用户(例如,CRM系统的订户)访问、处理和查看从MTS16经由网络14向其提供的信息和页面。每一用户系统12—般也包括一个或多个用户接口设备,诸如键盘、鼠标、触摸屏、笔等,用于与显示器上(例如,监视器屏幕、LCD显示器等)由浏览器提供的图形用户界面(GUI)以及由MTS16或其它系统或服务器提供的页面、表单和其它信息交互。如上所述,本发明适用于因特网,因特网指的是网络的专用全球互联网。然而,应理解,可使用其它网络来代替因特网,诸如内联网、外联网、虚拟专用网(VPN)、非基于TCP/IP的网络、任何LAN或WAN等。根据一个实施例,每一用户系统12及其所有组件是使用诸如浏览器等应用程序可配置的操作器,这些应用程序包含使用诸如英特尔奔腾处理器等的中央处理单元运行的计算机代码。类似地,MTS16(以及存在一个以上的MTS的附加实例)及其所有组件可以是使用应用程序可配置的操作器,这些应用程序包含使用诸如英特尔奔腾处理器等一中央处理单元或多个处理器单元运行的计算机代码。用于操作和配置MTS16来与此处所述的网页和其它数据以及媒体内容互相通信并对其进行处理的计算机代码较佳地被下载和存储在硬盘上,但整个程序代码或其部分也可被存储在所公知的任何其它易失性或非易失性存储器介质或设备中,诸如ROM或RAM,或在能够存储程序代码的任何介质上提供,诸如光盘(CD)介质、数字多功能盘(DVD)介质、软盘等。另外,如公知的,整个程序代码或其部分可例如经由因特网从软件源或从另一服务器中发送或下载,或经由使用所公知的任何通信介质和协议(例如,TCP/IP、HTTP、HTTPS、以太网等)的公知的任何其它常规网络连接(例如,外联网、VPN、LAN等)发送。可以理解,用于实现本发明的各方面的计算机代码能以可在服务器或服务器系统上执行的任何程序设计语言来实现,诸如例如以C、C++、HTML、Java、JavaScript、诸如VBScript等任何其它脚本语言以及公知的众多其它程序设计语言来实现。根据一个实施例,每一MTS16被配置成向用户系统12提供网页、表单、数据和媒体内容,以支持作为MTS16的租户的用户系统12进行的访问。如此,除非数据被共享,否则MTS16提供安全机制来保持每一租户的数据分开。如果使用一个以上MTS,它们可位于彼此靠近的位置(例如,在单幢建筑物或校园中的服务器场(serverfarm)中),或它们可分布在彼此远离的位置中(例如,位于城市A中的一个或多个服务器以及位于城市B中的一个或多个服务器)。如此处所使用的,每一MTS可包括本地或跨一个或多个地理位置分布的一个或多个逻辑和/或物理连接的服务器。此外,术语"服务器"旨在包含计算机系统,它包括处理硬件和进程空间、以及相关联的存储系统和本领字段中公知的数据库应用程序(例如,RDBMS)。也应理解,"服务器系统"和"服务器"在此处通常可互换使用。类似地,此处所述的数据库可被实现为单个数据库、分布式数据库、分布式数据库的集合、具有冗余在线或离线备份或其它冗余的数据库等,且可包含分布式数据库或存储网络及相关联的处理智能。图2更详细地示出了MTS16的各元素和各种互连。在此示例中,网络接口被实现为一个或多个HTTP应用程序服务器100。也示出了包含单独的租户进程空间104的系统进程空间102、系统数据库106、租户数据库108和租户管理进程空间110。租户数据库108可被划分成单独的租户存储区112,这可以是物理排列或逻辑排列。在每一租户存储区112内,可为每一用户类似地分配用户存储114。也应理解,每一应用程序服务器100可经由不同的网络连接通信地耦合至数据库系统,例如系统数据库106和租户数据库108。例如,一个服务器100i可以经由因特网14耦合,另一服务器lOON.i可经由直接网络连接耦合,而另一服务器100N可经由又一不同的网络连接耦合。传输控制协议和互联网协议(TCP/IP)是用于在服务器100与数据库系统之间通信的较佳的协议,然而对本领字段的技术人员显然的是,取决于所使用的网络互连,可使用其它传输协议来优化系统。在较佳的方面中,每一应用程序服务器100被配置成为任何用户/组织处理请求。因为期望能够在任何时间为任何原因向服务器池添加应用程序服务器或从中移除应用程序服务器,较佳地不存在用户和/或组织对特定应用程序服务器100的任何服务器亲和力(serveraffinity)。因此,在一个实施例中,实现负载平衡功能的接口系统(未示出)(例如,图5的Big-IP负载平衡器)在服务器100与用户系统12之间通信地耦合,以便向服务器100分发请求。在一个方面中,负载平衡器使用最少连接算法将用户请求路由至服务器100。也可使用负载平衡算法的其它示例,诸如循环和观察响应时间。例如,在某些方面中,来自同一用户的三个连续的请求可命中三个不同的服务器,且来自不同用户的三个请求可命中同一服务器。以此方式,MTS16是多租户的,其中MTS16处理跨不同用户和组织的不同对象和数据的存储。作为存储的一个示例,一个租户可以是雇佣销售人员的公司,其中每一销售员使用MTS16来管理他们的销售过程。因此,用户可维护联系人数据、潜在顾客数据、顾客跟踪数据、性能数据、目标和进展数据等,所有这些均适用于该用户的个人销售过程(例如,在租户数据库108中)。在较佳的MTS安排中,由于所有这些数据以及要访问、查看、修改、报告、传输、计算等的应用程序可由仅能够进行网络访问的用户系统来维护和访问,因此用户可从众多其它用户系统中的任一个管理他或她的销售成果和周期。例如,如果销售员正拜访顾客,且该顾客在他们的大厅里具有因特网接入,则销售员在等待顾客到达大厅的同时可获得关于该顾客的关键的更新。尽管每一用户的销售数据可以不论每一用户的雇主为何而与其它用户的销售数据分开,但某些数据可以是组织范围内数据共享的,或可由多个用户或作为租户的给定组织的所有销售人员访问。因此,可能存在由MTS16管理在租户级分配的某些数据结构,而其它数据结构可在用户级管理。因为MTS可支持包含可能竞争者的多个租户,因此MTS应具有保持数据、应用程序和应用程序使用分开的安全协议。而且,因为多个用户可选择访问MTS而不是维护他们自己的系统,因此冗余性、正常运行时间和备份是更关键的功能并需要在MTS中实现。除用户专用数据和租户专用数据以外,MTS16也可维护可由多个租户使用的系统级数据或其它数据。这样的系统级数据可包括可在租户之间共享的行业报告、新闻、告示等。在某些方面中,客户机系统12与应用程序服务器IOO通信来请求和更新来自MTS16的系统级和租户级数据,这可能需要对数据库系统106和/或数据库系统108的一个或多个查询。MTS16(例如,MTS16中的应用程序服务器100)自动生成被设计成访问所需信息的一个或多个SQL语句(SQL查询)。每一数据库一般可看作包含符合预定义目录的数据的对象的集合,诸如一组逻辑表。"表"是数据对象的一种表示,此处用来简化根据本发明的对象和自定义对象的概念描述。应理解,"表"和"对象"在此处可互换使用。每一表一般包含逻辑上以可查看模式排列成列或字段的一个或多个数据目录。表的每一行或记录包含由字段定义的每一目录的数据的实例。例如,CRM数据库可包括描述顾客的表,该表带有诸如名字、地址、电话号码、传真号码等基本联系信息的字段。另一表可描述购买定单,包含诸如顾客、产品、销售价格、日期等信息的字段。在某些多租户数据库系统中,可提供标准实体表。对CRM数据库应用,这样的标准实体可包括帐户、联系人、潜在顾客和机会数据的表,每一张表包含预定义的字段。自定义字段根据一个实施例,对诸如标准实体的表的一张表,在物理模式中定义了附加的一组一列或多列,例如io、100或250列的文本数据。这些附加的列此处也被称为自定义数据列、自定义字段列或自定义字段,它们允许系统管理员定义未包含在该实体的预定义标准字段中的附加的字段。这些自定义字段较佳地含有VARCHAR(变长字符)数据类型。在一个方面中,这些自定义字段较佳地存储在来自主实体表的行之外,尽管这些字段可被存储在主表中。例如,如果主表被称为"sales.account",则自定义字段数据可以被存储在被称为"sales.account—cfdata"的表中,其中"Cf"代表"自定义字段"。这两张表较佳地包含区分租户行的organization一id列,以及在整个数据库中标识这些行的相同索引的主键(例如,在此情况中为帐户id)。而且,这两张表较佳地在DB(例如,OracleDB)上物理分区来促进平行化,例如当需要为维护目的而对整张表操作和需要维护较浅的索引时。图3示出了表示为主表220和相关联的自定义字段表210的对象的示例。在图3中所示的特定示例中,主表200(.account)表示标准帐户实体,自定义字段表210(.account—cfdata)包含由使用主表200的各个组织(租户)定义的自定义字段。如图所示,主表200包括组织ID("orgid")列201和用作表200的主键的表ID(例如,.accountid的"accid")列202。数据表200也包括多个数据列203。在图3的特定示例中,其中表表示标准实体,数据列203是向可使用该表的各个组织提供的预定义数据列,即标准字段。在标准帐户实体示例中,这样的标准字段可包括名字列、地点列、多个雇员列以及可用于存储帐户相关信息的其它列。每一数据列203较佳地被定义为对每列存储单个数据类型。提供orgid列201来区分使用多租户帐户表200的组织。如图所示,N个不同的组织含有在表200中存储的数据。歹U201中的orgid较佳为Char(15),但可包含其它数据类型。在一个方面中,orgid的前3个字符被置成预定义的前缀,诸如"00d",尽管如有需要,orgid中的字符的另一子集可用于保存这样的前缀。自定义字段表210类似地包括orgid列211、表id列212和多个数据列213。如上所述,表id列212用作表210的主键,且较佳地包含与表200的表id列202相同的值。在所示的特定示例中,存在标注为va10、vall.,.val249的250个数据列213。可以理解,按照期望的方式可使用任何其它编号,例如10或100。当一开始创建组织并使其与数据库表200相关联时,对该组织自定义字段列213为空。然而,每当在主表(例如帐户)中创建记录,即行时,在自定义字段表中创建相应的行——所有的自定义字段列为NULL,从而直到使用之前不占用任何空间。在一个方面中,仅当例如由组织的管理员定义该组织的新"列"时,才允许将数据输入这些自定义字段中。例如,在帐户实体示例中,可能期望特定组织来创建除标准字段203以外的一个或多个附加的自定义字段,来存储在预定义标准字段中可能未说明的特定类型的数据。本发明有利地允许组织为这样的数据创建附加的自定义列。该定义被存储在元数据中,例如在可包含一个或多个元数据表的元数据目录中,而非定义物理列(在Oracle中,其定义将被置于Oracle词典式目录中)。物理列的定义同样可按照XML或某种其它格式存储。图6a示出了根据本发明的一个实施例的自定义字段定义元数据表500("custom—field—definition")的示例。custom_fidd—definition元数据表500被用于为每一组织定义的每一自定义字段列和表(例如,将在以下更详细描述的标准表和自定义表)存储名字、数据类型和其它信息。如图所示,元数据表500包括custom—field—definition—id(自定义字段定义id)列510、organization—id(组织id)列520、tablenameorid(表名字或id)列530、fieldname(字段名)歹(J540、fielddatatype(字段数据类型)列550、is—indexed(是否索引)列560以及column_number(列号)列570。Organization—id列520存储为其创建自定义字段的组织的orgid,custom—field—definition—id列是表500的主键。tablename列530存储标准实体表的名字,诸如帐户,或为组织创建的自定义实体表的id。fieldname列540存储自定义字段的文本名,fielddatatype列550存储该自定义字段的数据类型。数据类型的示例包括文本、数字、日期、参数选用表等。参数选用表数据类型是其中值从所枚举的值列表中选择值的文本字段。参数选用表一般显示为UI中的下拉式菜单。isjndexed列560存储指示字段是否被标志为用于索引的值,这将在以下更详细描述。在一个方面中,列560存储布尔值。column—number列570存储分配给自定义字段表210(图3)中的自定义字段的列号(例如,"valO")。在应用中创建新的自定义字段将分配自定义字段列213的其中之一来保存数据。在较佳方面中,最小编号的列被首先填入。例如,如图3中所示,对每一组织首先填入"valO"歹U,然后是"vall"列,以此类推。从而,取决于由组织定义的自定义列的编号,每一自定义字段213可包含或可不包含该组织的数据。现在,当组织中的应用程序的用户编辑该表的行时,新的自定义字段出现在屏幕上(或经由API出现),这将与其它标准字段一样出现。然而,当数据被持久保存在数据库中时,该自定义字段的值被存储在单独的自定义字段表210的指定自定义字段列中,而非在标准主表200中。在一个方面中,对这些自定义字段允许多个虚拟数据类型,即使底层物理存储可能是基于字符的。当组织的系统管理员定义例如数字或日期自定义字段类型时,则值以允许容易转换回逻辑数据类型的规范格式存储为文本。如前所述,在一个方面中,较佳地使用VARCHAR的数据类型。例如,在该方面中,数据以YYYYMMDD格式存储,这允许经由TO—DATE(〈列、'YYYYMMDD,)函数转换,并且也允许不经任何转换而进行适当的排序。对数字,使用通常的十进制格式,并且可使用Oracle函数TO一NUMBER()来转换回数字值,以便排序、数学运算和过滤等。因为数据库是多租户的,给定的物理自定义字段列可包含跨多个组织的数据。例如,因为组织不限于特定数据类型,因此一个组织可定义诸如日期的一种数据类型,而另一组织可定义诸如串或数字的不同的数据类型。从而可能在一个物理自定义字段列中找到串、数字和日期。图3示出了包含不同数据类型的自定义字段列的示例。如例如"val0"自定义列中所示,由组织l定义的自定义列数据类型是数据类型l,由组织2定义的自定义列数据类型是数据类型2,而由组织N定义的自定义列数据类型是数据类型3。数据类型l、2和3可以是相同的,或它们可以不同。例如,数据类型l可以是文本,数据类型2可以是日期而数据类型3可以是数字。图7及以下的相关讨论示出了其中在自定义字段列中混合不同数据类型的示例。在一个方面中,为不同数据类型的自定义字段提供了单独的列池,即单独的池中的每一自定义字段列包含单个数据类型。在一个实施例中,使用元数据来确定给定自定义字段列中的数据类型。艮P,元数据被用于跟踪每一自定义列中的每一组织的逻辑数据类型。在一个方面中,从元数据中创建映射函数。例如,当组织为标准实体定义自定义字段时,在元数据表500中存储了自定义字段定义,包括该组织的组织id、表名(例如,.account一cfdata)和自定义表中分配的列号(例如,va10)。以这种方式,给定列号、表名和组织id,可确定任何自定义列中的数据类型以供有效的数据检索。自定义字段索引现在考虑索引这些自定义字段列(例如,列213)中的数据以便允许快速检索的问题。例如,用户期望将数据值过滤为日期,将数字值过滤为编号。然而,为了使这些过滤器能有效工作,给定用于转换它们的值的上述表达式,需要对给定自定义字段列表中的每一组织的数据片施加函数索引(例如,OracleDB函数索引)。这从OracleDB观点来看是不可能的,因为OracleDB不理解一个物理列包含多个格式的数据。例如,如果试图对以上TO一DATA或TO一NUMBER表达式创建索弓I,则由于在该物理列中的其它文本值不符合期望的格式而导致出错。类似地,当对串数据搜索时,用户期望大小写不敏感的搜索。即,搜索"car"应找到"CAR"或"CaR"。然而,大小写不敏感的定义是取决于语言的,而使用这样的多租户数据库结构的服务(例如,CRM服务)可能启用多语言。为对多语言的数据适当搜索,需要使用利用Oracle中的各种NLS(自然语言标准)函数建立的函数索引。由于给定的物理列可包含多种语言的数据,有必要为所支持的每一语言建立N个不同的索引,这将导致不可量的解。鉴于以上列出的原因,在一个实施例中通过在单独的一组索引列中对数据排序来实现这样的"索引的自定义字段"。根据本发明的一个实施例,提供了多个附加的索引列以便允许索引自定义字段。当自定义字段由数据库管理员标志用于索引时,多个索引列的其中之一被分配给该带有标志的列。来自带有标志的列的数据被复制给所分配的索引列。数据以便于搜索,例如日期和串的格式被存储在索引列中。例如,YYYYMMDD本身是可搜索的格式,因为按此格式的串可使用普通串比较来进行词汇上的比较。图4示出了根据一个实施例表示为包含物理索引列320的自定义字段表310的自定义对象的示例。在一个方面中,每一自定义字段数据表包含多个(例如,10、100、250等)例如使用标准Oracle8*树索引的物理索引的列320。在具有10个索引的列的示例中,管理员从而可指定要索引的多达io个串或日期类型的自定义字段。当自定义字段被标志用于索引时,原始列中的数据(它们仍旧被维护以便当需要时向用户显示未经修改的格式)被复制到这些索引的列的其中之一。例如如图4中所示,自定义数据字段"valO"由组织1的系统管理员标志为索引的自定义列。来自该带有标志的列的数据被复制给索引列"ivalO"。类似地,自定义数据字段"vall"由组织2的系统管理员标志为索引的自定义列,来自该带有标志的列的数据被复制到索引列"ivalO"。稍后,组织2的系统管理员可标志另一自定义字段列,来自该列的数据被复制给另一索引列(例如,如图4中所示,列"valO"的数据复制到列"ivall")。在一个方面中,类似于自定义字段,较佳地首先使用或填入最小编号的索引列。在一个方面中,为避免跨多种语言进行搜索的问题,实现(例如,在应用程序服务器中)将每一串自定义字段值转换成通用大小写不敏感格式的"大小写折叠"算法。一种这样的大小写折叠算法是由UnicodeConsortium(统一代码联盟)在Unicode4.0标准3.13章一一CaselessMatching(http:〃www.unicode.org/versions/Unicode4.0.0/ch03.pdf)中定义的算法,它通过引用包含在此,这是对具有大小写概念的所有语言将字符转换成可独立于大小写进行二元比较的形式的表式查找函数。无论何时搜索到原始自定义字段列中的值,SQL即改为在对正搜索的文字执行相同的大小写折叠操作之后对相应的大小写折叠的索引的列进行过滤。数据不必从其YYYYMMDD格式修改,这些数据也作为文本包含在索引(未经修改的)中。选择不使用索引的自定义字段的组织则在这些字段中具有null值,而NULL在索引中不占用任何空间。以此方式,数据库中空间仅当实际索引自定义列时才被消耗。而且,索引列320较佳地被存储在相应的自定义字段表中,然而,它们可被存储在行以外,在此情况中,较佳地orgid311和tableid312列被复制到单独的索引的列表中以便于搜索。自定义字段唯一性另一期望的模式特征是唯一性约束概念。再一次,不能对自定义字段物理列施加唯一索引,因为尽管值可能对一个组织是唯一的,但它们可能对共享该物理列的某些其它组织不唯一。例如,有可能两个不同组织的两条记录具有存储在同一自定义字段中的同一提取数据值。为实现该唯一性特征,在一个方面中,提供了仅包含要求唯一性的顾客的数据值的单独的表。一旦组织管理员为唯一性而启用了自定义字段,该组织的所有值被插入该唯一的索引表中,且对该自定义字段列的正在进行的改变被同步更新到该唯一索引表(以下描述)。如果这些操作中的任一引起OracleDB唯一索引违反,则向最终用户传回该错误——管理员需要在声明其唯一之前"清除"字段中的数据。唯一索引维护表的一种模式如下-1.organization—id(组织id)2.customfielddefinitionid(自定义字段定义id)3.customfieldvalue(自定义字段值)该模式允许索引来自同一组织(和实体)的多个自定义字段。前两列较佳地以OracdDB唯一索引压縮,这将使得物理索引较小,且该表可以是索引组织的,因为其作为表的唯一目的是用作唯一索引。自定义表期望为扩展基本应用或与其它系统集成的目的而创建全新的逻辑实体表(实体)。例如,使用由系统提供的标准实体的组织可期望创建一个或多个新实体来特别迎合该组织的特定企业模型且便于为该组织的特定企业模型进行数据存储和检索。从而,本发明的一个实施例提供创建自定义实体表或自定义实体的功能。如同自定义字段的方法一样,根据一个实施例,所有的自定义实体数据行被存储在单个多租户物理表中。然而,不同于标准自定义字段表,自定义实体数据表在一个方面中对每个组织包含多个逻辑表。顾客的多个"表"实际上存储在一个大型表中,这对顾客是透明的。图5示出了根据一个实施例表示为自定义实体表400的自定义对象的示例。表400包括orgid列401、customentityid(自定义实体id)列402和多个customfield(自定义字段)列403(标记为"val0"、"vail"…)。也可提供多个可任选索引列420(标记为"ival0"、"ivall")。orgid列被用于区分各个组织填充表400。例如,多个组织可创建自定义实体,一个方面中所有的自定义实体被存储到表400。customentityid列402被用于区分存储在表400中的各个自定义实体表。customentityid列402也用作表400的主键。customfield列403用于为由各个组织定义的各个自定义实体存储数据。特别地,自定义字段列403存储为由各个组织填充表400定义的各个自定义实体的每一个所定义的列。索引列420类似于以上参考图4描述的自定义字段索引的列320来实现。根据一个实施例,全局唯一主键字段402的前3个字符被用于标识具体实体类型。该技术有利地允许一个组织的多个自定义实体类型在该一个自定义实体表400中区分,如将在以下描述的。然而可以理解,可使用主键的少于或多于3个的字符来标识实体,或者可使用主键的字符的任何子组合。当组织管理员定义新的自定义实体时,该定义被存储在元数据中而非底层数据词典中。图6b示出了根据本发明的实施例的自定义实体定义元数据表600("custom—entity—definition")的示例。当定义新的自定义实体时,数据库系统为该实体类型的行分配(该组织内)唯一的3字符前缀。一个方面中,选择字母'a'作为所有自定义实体主键的第一个字符,例如如表400的列402中所示的a01...a02...a03...aMN...。如图所示,跨所有组织,可重复使用该相同的3字符前缀。例如,重复使用"a01"作为多个组织的前缀。然而,自定义实体id的其余部分确保全局唯一性(且来自不同组织的数据永不混合)。在一个方面中,这些3字符id以基62编码,因此每一初始字符允许每个组织62*62=3844个不同的自定义实体类型——这是对基本上所有的使用足够大的数字。然而,应理解可使用不同的编码基来为每个组织提供更少或更多自定义实体类型。也应理解,自定义实体id字段可以是合成主键,例如跨两个或多个列,一个列用于前缀,其它列用于自定义实体id的其余部分。为简单起见,在表400中未示出行分区,然而示出了组织分区450和实体分区460。参考图6b,使用custom—entity_definition元数据表600来记录为每一组织所定义的每一自定义实体对象的名字和其它信息。如图所示,元数据表600包括custom—entity—definition—id(自定义实体定义id)列610、organization—id(组织id)列620、entity—name(实体名)列630以及keyprefix(键前缀)列540。organization—id列620存储对其创建自定义实体的组织的orgid,custom—entity—definition—id列610是表600的主键。entity—name列630存储自定义实体表的名字,例如作为文本数据类型。keyprefix列640存储为该实体类型的行分配的3字符前缀(例如,"a01"、"a02"等)。当创建自定义实体表时,组织的管理员为自定义实体指定(组织内)唯一的开发员名字——这是用于标识API调用的特定实体以及进入系统的其它开发员入口点的名字。该名字存储在表600的实体名列630中。自定义字段也可为自定义实体定义,如上所述,当期望时,自定义字段可标志用于索引。一旦为自定义实体定义了自定义字段,组织即可开始像任何其它标准实体一样使用该自定义实体。例如,所有的API操作(例如,描述、插入、更新、删除、査询、搜索)均可用,且组织可定义用户界面,用于在在线应用程序中编辑该自定义实体。然而,.该自定义实体表对用户和组织是透明的,它以及由该组织和其它组织定义的其它自定义实体表被存储在单个自定义实体表400中。当对自定义实体表操作时,SQL方面的一个不同是,除对组织id以外,还需对自定义实体id过滤来确保来自一个组织内的多个逻辑实体类型的数据不混合在一起。例如,主键索引的前3字符部分(例如,a01…aMN)可用于这种有效的过滤。因此,对组织id和3字符前缀的过滤提供了对该组织的特定实体类型的判断。类似地,应向插入PL/SQL调用告知当插入新主键值和自定义实体行时将使用哪个3字符前缀。类似于图3的自定义字段列213,自定义字段列403可包含多个数据类型。例如,如图所示,当组织#1定义自定义实体表1(表400中由"a01"或orgl"00dl"标识)时,具有数据类型1的自定义字段列定义可被分配给"val0"列。类似地,如图所示,具有数据类型2的第二自定义实体表(由orgl的"a02"标识)的自定义字段列定义可被分配给"val0"列。数据类型1和2可以相同或不同。以此方式,有可能可为由各个组织定义的各个自定义实体在自定义实体表400中的任何给定自定义字段列403中存储众多数据类型。从而,如上所述,使用可任选索引字段420,组织能够标志其自定义实体中的一个或多个列用于索引。过滤也可类似于上述方式进行。在一个实施例中,当创建自定义实体时,外键可定义为数据类型。以此方式,可提供与标准实体或另一自定义实体的关系,以便于数据存储和检索(例如,减少冗余数据存储)。例如,当定义自定义实体时,系统管理员可将自定义字段定义为外键数据类型,以建立与一个或多个其它实体的关系。相关实体的主键被复制并存储在该自定义字段中。在一个方面中,提供多个列来存储类型为外键的自定义字段。这些单独的列可被索引。具体示例图7示出了包含标准列703和自定义字段列713的标准实体表700的示例,以及多个组织的实际数据值的示例。如图所示,标准表700表示具有标准name(名字)字段和其它标准字段703的帐户实体。在此示例中,ABC公司(由orgid字段701中的"00dl"标识)为"accountwebaddress(帐户网址)"定义了自定义列,它被分配给val0列。该自定义字段的数据类型被定义为文本。此外,ABC公司为"accountstockprice(帐户股票价格)"定义了第二自定义字段,它被分配给vall歹!],并为"accounttickersymbol(帐户定单符号)"定义了第三自定义字段,它被分配给另一列。这些列的数据类型分别是数字和文本。类似地,123公司(由orgid字段701中的"00d2"标识)和XYZ公司(由orgid字段701中的"00dN"标识)各自分别为"accountnextannualmeetingdate(帐户下一年会日期)"和"accountfiscalyear(帐户财政年度)"定义了自定义字段。这些自定义字段的数据类型分别是日期和参数选用表。这些自定义字段均被分配给val0列,尽管它们的数据类型不同。如上所述,这些自定义字段的定义被存储到例如元数据表500的元数据中。如图所示,表700为ABC公司保存帐户数据,包括所示的"IBM"、"Ddl"和"Apple"的具体帐户数据。类似地,表700也为123公司和XYZ公司保存帐户数据。如图所示,123公司和XYZ公司对具有相同名字"Disney"的帐户各族具有特定条目。然而,这些条目基于全局唯一主键702(或712)区分。例如,对XYZ公司,"Disney"的帐户条目具有主键值"001…932",而123公司的"Disney"俄帐户条目具有主键值"001...87"。如上所述,va10自定义列中的数据值具有混合的数据类型。例如,对ABC公司,"webaddress"字段是文本,而123公司的"nextannualmeetingdate"字段具有日期数据类型,XYZ公司的"fiscalyear"字段具有参数选用表数据类型。图8示出了包含ABC公司的自定义表810的自定义实体对象800的示例。如图所示,ABC公司(由orgid列801中的"00dl"标识)定义了表示资产的自定义对象810。资产对象810的定义被存储到元数据,例如表600中(图6b)。资产对象810为customentityid(自定义实体id)分配了前缀"a02"。而且,如图所示,ABC公司定义了另一自定义对象,例如在customentityid列802中由前缀"a01"标识。可在表800中提供单独的列来存储表800中所存储的各个对象的前缀(例如,"a01")。使用自定义外键列和各个数据列定义了资产对象810。自定义外键(FK)列被分配给"ValO"列,而"assetname(资产名)"、"assetvalue(资产值)"、"assetdepreciationtype(资产贬值类型)"禾Q"assetreplacementdate(资产重置曰期)"的数据字段被分别分配给列"Vail"到"Val4"。在此示例中,这些字段的数据类型分别为文本、数字、参数选用表和日期。资产对象810是帐户对象700的子自定义对象。自定义外键列将对象810中的每一行连接至其父帐户(在这些示例中,帐户对象700为其tableid分配了前缀"001")。例如,外键值"001.,.9"连接至帐户名"DELL"的表700中的行。类似地,外键值"001...8"和"001…10"分别连接至帐户名"IBM"和"APPLE"的表700中的行。如图所示,而且XYZ公司(由orgid列801中的"00dN"标识)也定义了自定义对象来适应其企业需求,该自定义对象也存储在表800中。照此,任何给定的数据列803可包含取决于表800中所存储的各个自定义对象的定义的混合的数据类型。可重用服务自定义实体的一个目的不仅是支持数据网格(例如,由组织和/顾客配置的行和列),而且也支持为标准实体展示的同一组应用程序高级语义服务。这允许系统不仅作为在线数据提供者,而且作为具有复杂可重用服务的应用程序构建的基础架构。,参考salesforce.com服务,这样的可重用服务以及它们如何应用于自定义实体的若干示例如下-历史跟踪salesforce.com中的标准实体(诸如范例和机会实体)支持对数据至记录的改变进行自动监察。该监察一般发生在应用程序服务器中的较低级上,其中所有的数据正被写入数据库。该相同的代码路径较佳地与自定义实体一起使用。用于标准实体的相同的广义模式也用于自定义实体——这是较佳的每行带有一个字段增量的数据透视表(pivoted)模式1.organization—id2.customentitydataid(自定义实体数据id)3.customfielddefinitionid(自定义字段定义id)4.oldvalue(旧值)5.newvalue(新值)。然而,它可以是非数据透视表模式。非数据透视表模式对每一条单独的信息具有多个列。它看上去像excel电子表IDNamePhoneEmailaddress111Craig555-1212foo@bar.com数据透视表模式使用普通列名,诸如IDPropertyNamePropertyValue111NameCraig111Phone555-1212111EmailAddressfoo@bar.com数据透视表模式其中具有多得多的行,但这些行更瘦(想象,如果存在50列数据——这将变成数据透视表模式中的50行,但数据透视表模式本身具有相同的列)。因此正常模式是短而宽的,而数据透视表模式是高而瘦的。数据透视表模式可用于例如监察目的,诸如用于提供范例历史相关列表——其中,向用户示出每个字段值作为网格中的一行字段改变。然而,数据透视表模式一般难以用于如带有个人的所有信息的细节屏幕的正常数据显示。如果管理员在自定义实体和.自定义字段的定义中"开启"该属性,则其行为自动发生(改变被记录到这一个多租户监察表中)。该普通历史表中的数据可用于在在线应用程序中或经由API査询显示。作为示例,考虑对诸如范例等标准实体进行的改变。系统可当保存对范例的编辑时记录以下历史行Or。IdCaseIdFieldNameOldValueNswVslusDate00d15001SubjectProblemwithDiscdriveProblemwithDiscDrive3/4/0400d15001StatusOpenInProgress3/4/0400d15001PriorityLowMedium3/4/0400d15002StatusOpenClosed3/5/0400d15002RepN3me(cust0m)FrankSally3/5/04以上数据记录了两个编辑操作,一个是2004年3月4日对范例5001进行的,另一个是2004年3月5日对范例5002进行的。每次编辑若干个字段。作为另一示例,考虑对图8的资产自定义对象810进行的改变。2004年3月4日进行的单个编辑操作的历史跟踪行的示例可能如下OrgIdCustEntIdFieldNameOldValueNewValueDate00d1a02AssetNameLaptopXLaptopY3/4/0400d1a02AssetValue50453/4/0400d1a02Deprec.TypeLinearAccelerated3/4/04所有的这些信息由系统自动记录。用户界面(UI)可呈现类似于以上示出或按照任何其它方便的格式的信息。基于许可的安全和共享模型管理员可希望将访问限于来自特定用户配置文件的特定实体类型一一以具有诸如EDIT—ACCOUNT等许可的标准实体相同的方式。管理员可定义,给定的实体类型要求显式的READ(读)或EDIT(编辑)许可。普通profileCustomEntity(配置文件自定义实体)元数据表(可供经由API编辑使用)允许创建使配置文件(读访问)与自定义实体类型相关联的关系行,并可任选地声明该配置文件中的用户是否可编辑该实体类型的行。检索和编辑自定义实体数据的公共应用程序服务器和PL/SQL码然后可为当前用户检查该元数据,并且如果用户不具有适当的许可则拒绝操作。在一个方面中,共享模型允许对行的更细粒度的访问——除以上许可检査以外。管理员在定义自定义实体类型时,可选择该实体类型是否可由所有用户编辑(公有读/写)、对所有用户只读(公有读/只读)或者仅对记录的所有者或被准许对记录的显式共享访问的用户私有可用(私有)。为支持后面的共享模型,在一个方面中,向自定义实体数据表添加标准所有者字段,该字段在API中可用。附加到其它标准实体中的所有者字段的同一语义适用。例如,角色分层结构中的经理能访问下属拥有的所有记录。而且,例如customEntityShare(自定义实体共享)等普通共享实体在一个方面中被用于进入对用户或组的特定自定义实体行的手动显式共享访问——以accountShare(账户共享)实体可供在API(和UI)中使用以便允许准予显式的帐户访问的相同方式。货币类型自定义实体中的一标准字段是控制该行中所有数字货币自定义字段的货币的单货币类型。该功能与所有标准实体一致,且允许与应用程序中其它地方相同的货币兑换。每个实体类型多个商业处理标准实体允许多个"记录类型"或商业处理的定义。例如,机会实体可具有电话销售机会以及直接销售机会两者。取决于个别机会行的记录类型,可供参数选用表字段使用的值按照组织管理员配置的方式改变。自定义实体允许管理员对该同一元数据的指定。该实体中的参数选用表自定义字段较佳地以字段标准实体相同的方式作用。工作流程在一个方面中,本发明提供对触发条件的定义和对特定实体类型的动作。例如,如果机会量超过特定值(触发条件),则诸如电子邮件等通知被发送(动作)给预先指定的个人或组,例如该组织的销售副主管。再一次,内部用来定义这些规则的元数据较佳地以类似于对标准实体的方式对自定义实体操作。例如在应用程序服务器或数据库服务器中执行的代码为每一行编辑评估这些条件,它们在较低级出现,其中标准和自定义实体均能够利用该功能。尽管经由示例并按照特定实施例描述了本发明,但可理解本发明不限于所公开的实施例。相反,如对本领字段的技术人员而言,显然它旨在覆盖各种修改和类似的安排。从而,所附权利要求书的范围应与最宽泛的解释一致,以便包含所有这样的修改和类似的安排。权利要求1.一种在单个多租户数据结构中为多个租户存储多个字段的计算机实现的方法,包括定义具有多个数据列和一个或多个索引列的多租户数据结构;为第一租户定义第一数据字段,所述第一字段具有第一数据类型;为第二租户定义第二数据字段,所述第二字段具有第二数据类型,其中所述第二数据类型不同于所述第一数据类型;当在所述第一和第二字段中具有数据值的记录由所述第一和第二租户创建时,将所述第一和第二字段的数据值存储到所述数据结构中的单个列中,其中所述单个列包括数据值,所述数据值对不同租户具有不同数据类型;以及响应于来自所述第一租户的在所述第一数据字段中索引数据的请求,将所述单个数据列中为所述第一字段存储的数据值复制到所述索引列的第一个中。2.如权利要求l所述的方法,其特征在于,还包括-定义具有一个或多个列的单独的数据结构;以及响应于来自所述第一租户和所述第二租户的、分别关于所述第一数据字段或第二数据字段中的数据为唯一的指示,将分别对应于所述第一数据字段或第二数据字段的存储在所述单个数据列中的数据值复制到所述单独的数据结构中。3.如权利要求l所述的方法,其特征在于,所述复制包括将所复制的数据值转换成经修改的格式。4.如权利要求3所述的方法,其特征在于,所述转换包括对所述数据值应用大小写折叠算法。5.—种在单个多租户数据结构中为一个或多个组织容纳多个表的计算机实现的方法,包括定义含有主键列、组织id列和多个数据列的多租户数据结构;为第一租户定义第一表,所述第一表具有第一数据字段,且所述第一租户具有第-一租户id;将第一表id分配给所述第一表;为第二租户定义第二表,所述第二表具有第二数据字段,且所述第二租户具有第二租户id;将第二表id分配给所述第二表;其中当由所述第一租户为所述第一表创建记录时,对所创建的每一记录a)将所述第一数据字段的值存储到所述数据结构中的单个数据列;b)将所述第一租户id存储到所述组织id列;并且C)将所述第一表id存储到所述主键列;以及其中当由所述第二租户为所述第二表创建记录时,对所创建的每一记录a)将所述第二数据字段的值存储到所述数据结构中的单个数据列;b)将所述第二租户id存储到所述组织id列;并且C)将所述第二表id存储到所述主键列;以及其中所述第一和第二租户的第一和第二表被存储到所述数据结构中。6.如权利要求5所述的方法,其特征在于,所述数据结构包括一个或多个索引列,所述方法还包括响应于来自所述第一租户的在所述第一数据字段中索引数据的请求,将所述单个数据列中为所述第一表存储的数据值复制到所述索引列的第一个中。7.如权利要求6所述的方法,其特征在于,所述复制包括基于所述第一租户id、所述第一表id和所述第一数据字段标识要被复制的数据值。8.如权利要求5所述的方法,其特征在于,所述第一数据字段具有第一数据类型,且所述第二数据字段具有不同于所述第一数据类型的第二数据类型,使得所述单个数据列包括具有所述第一和第二数据类型的数据值。9.一种用于在单个数据结构中为一个或多个租户存储多个表的计算机实现的方法,包括定义具有主键列、组织id列和多个数据列的数据结构;为第一租户定义第一表,所述第一表具有第一数据字段,所述第一数据字段具有第一数据类型,且所述第一租户具有第一租户id;将第一表id分配给所述第一表;为所述第一租户定义第二表,所述第二表具有第二数据字段,所述第二数据字段具有不同于所述第一数据类型的第二数据类型;将第二表id分配给所述第二表;其中当为所述第一表创建记录时,对所创建的每一记录a)将所述第一数据字段的值存储到所述数据结构中的单个数据列;b)将所述第一租户id存储到所述组织id列;并且C)将所述第一表id存储到所述主键列;以及其中当为第二表创建记录时,对所创建的每一记录a)将所述第二数据字段的值存储到所述单个数据列;b)将所述第一租户id存储到所述组织id列;并且C)将所述第二表id存储到所述主键列;其中所述第一租户的所述第一和第二表被存储到所述数据结构中,且其中所述单个数据列包括具有所述第一和第二数据类型的数据值。10.如权利要求9所述的方法,其特征在于,还包括为第二租户定义第三表,所述第三表具有第三数据字段,所述第三数据字段具有第三数据类型,且所述第二租户具有第二租户id;以及将第三表id分配给所述第三表;其中当为所述第三表创建记录时,对所创建的每一记录将所述第三数据字段的值存储到所述数据结构中的所述单个数据列中;将所述第二租户id存储到所述组织id列中;以及将所述第三表id存储到所述主键列中;其中所述第一、第二和第三表存储在所述数据结构中,且其中所述单个数据列包括具有所述第一和第二数据类型和所述第三数据类型的数据值。11.如权利要求9所述的方法,其特征在于,所述第一和第二表id是不同的。12.如权利要求IO所述的方法,其特征在于,所述第一和第二表id是不同的,且所述第三表id与所述第一和第二表id的其中之一相同。13.如权利要求9所述的方法,其特征在于,所述数据结构包括一个或多个索引列,所述方法还包括响应于来自所述第一租户的在所述第一数据字段中索引数据的请求,将所述单个数据列中为所述第一表存储的数据值复制到所述索引列的第一个中。14.如权利要求13所述的方法,其特征在于,所述复制包括将所复制的数据值转换成经修改的格式。15.如权利要求14所述的方法,其特征在于,所述转换包括对所述数据值应用大小写折叠算法。16.如权利要求9所述的方法,其特征在于,所述第三数据类型是从由所述第一数据类型、所述第二数据类型和不同于所述第一和第二数据类型的数据类型组成的组中选择的。17.如权利要求9所述的方法,其特征在于,当所述第一租户为所述第一表创建记录时,执行过程来判断所述记录的所述第一数据字段中的数据值是否满足阈值条件,如果满足,则处理动作规则。18.如权利要求17所述的方法,其特征在于,所述动作规则指示通知的接收方,所述方法还包括自动向所述接收方发送通知消息。19.如权利要求9所述的方法,其特征在于,还包括为所述第一数据表定义所有者字段,其中存储在所述所有者字段中的每一数据值指示对相关联的记录的分层结构用户访问级别。20.—种存储用于控制数据库以便在单个多租户数据结构中为多个租户存储多个字段的代码的计算机可读介质,所述代码包含指令,用于-定义具有多个数据列和一个或多个索引列的多租户数据结构;为第一租户定义第一数据字段,所述第一字段具有第一数据类型;为第二租户定义第二数据字段,所述第二字段具有第二数据类型,其中所述第二数据类型不同于所述第一数据类型;当在所述第一和第二字段中具有数据值的记录由所述第一和第二租户创建时,将所述第一和第二字段的数据值存储到所述数据结构中的单个列中,其中所述单个列包含数据值,所述数据值对不同租户具有不同数据类型;以及响应于来自所述第一租户的在所述第一数据字段中索引数据的请求,将所述单个数据列中为所述第一字段存储的数据值复制到所述索引列的第一个中。21.—种存储用于控制数据库以便在单个多租户数据结构中为多个租户存储多个字段的代码的计算机可读介质,所述代码包含指令,用于定义含有主键列、组织id列和多个数据列的多租户数据结构;为第一租户定义第一表,所述第一表具有第一数据字段,且所述第一租户具有第一租户id;将第一表id分配给所述第一表;为第二租户定义第二表,所述第二表具有第二数据字段,且所述第二租户具有第二租户id;将第二表id分配给所述第二表;其中当由所述第一租户为所述第一表创建记录时,对所创建的每一记录a)将所述第一数据字段的值存储到所述数据结构中的单个数据列;b)将所述第一租户id存储到所述组织id列;并且C)将所述第一表id存储到所述主键列;以及其中当由所述第二租户为所述第二表创建记录时,对所创建的每一记录a)将所述第二数据字段的值存储到所述数据结构中的单个数据列;b)将所述第二租户id存储到所述组织id列;并且C)将所述第二表id存储到所述主键列;以及其中所述第一和第二租户的第一和第二表被存储到所述数据结构中。22.—种多租户数据库系统,包括用于存储多租户数据对象的数据库;以及数据库管理进程,它被配置成在所述数据库中定义多租户数据结构,所述数据结构具有多个数据列和一个或多个索引列;为第一租户定义第一数据字段,所述第一字段具有第一数据类型;为第二租户定义第二数据字段,所述第二字段具有第二数据类型,其中所述第二数据类型不同于所述第一数据类型;当在所述第一和第二字段中具有数据值的记录由所述第一和第二租户创建时,将所述第一和第二字段的数据值存储到所述数据结构中的单个列中,其中所述单个列包含数据值,所述数据值对不同租户具有不同数据类型;以及响应于来自所述第一租户的在所述第一数据字段中索引数据的请求,将所述单个数据列中为所述第一字段存储的数据值复制到所述索引列的第一个中。23.—种多租户数据库系统,包括用于存储多租户数据对象的数据库;以及数据库管理进程,它被配置成在所述数据库中定义多租户数据结构,其中所述数据结构具有主键列、组织id列和多个数据列;为第一租户定义第一表,所述第一表具有第一数据字段,且所述第一租户具有第一租户id;将第一表id分配给所述第一表;为第二租户定义第二表,所述第二表具有第二数据字段,且所述第二租户具有第二租户id;将第二表id分配给所述第二表;其中当由所述第一租户为所述第一表创建记录时,对所创建的每一记录a)将所述第一数据字段的值存储到所述数据结构中的单个数据列;b)将所述第一租户id存储到所述组织id列;并且C)将所述第一表id存储到所述主键列;以及其中当由所述第二租户为所述第二表创建记录时,对所创建的每一记录:a)将所述第二数据字段的值存储到所述数据结构中的单个数据列;b)将所述第二租户id存储到所述组织id列;并且C)将所述第二表id存储到所述主键列;以及其中所述第一和第二租户的第一和第二表被存储到所述数据结构中。全文摘要用于在固定物理数据库模式中容纳诸如动态表和列等可变模式数据的系统和方法。提供了诸如表的标准对象以供多个租户或组织在多租户数据库系统(201)中使用。每一组织可添加或定义自定义字段以包含在标准对象(203)中。多租户的自定义字段被存储在对象数据结构内的单个字段中,且该单个字段可对每一租户(213)包含不同的数据类型。还提供了索引列,其中租户可指定用于索引的字段。指定字段的数据值被复制到索引列中,每一索引列可包含多种数据类型(210)。每一组织也可定义包含自定义字段和索引列(201)的自定义对象。多个租户的自定义对象被存储在单个自定义对象数据结构中。单个自定义对象表的主键值是全局唯一的,但也可包括可在不同实体中重用的对象专用标识符。文档编号G06F17/30GK101120337SQ200580009510公开日2008年2月6日申请日期2005年3月31日优先权日2004年4月2日发明者C·韦斯曼,S·翁申请人:易享信息技术(上海)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1