Sharepoin学习笔记—架构系列-- Sharepoint的数据模型(DataModel)、数据管理(Data Management)与查询(Query System)
Sharepoint Foundation中的首要数据结构就是列表(List), 每个List属于某种List Type,与此类似,每个列表中的列(Column)属于某种FieldType,而每一条列表记录(List Item)属于某种Content Type.至于外部数据(External Data),即来自于Sharepoint Content Database数据库之外的数据,也能够在Sharepoint中显示和管理。
一、列表(List)
Sharepoint Foundation保存数据记录的方式类似于关系型数据库中的表(Table),只不过Sharepoint的术语称它们为列表(List),事实上这些数据记录被保存在Sharepoint内容数据库(Content Database)中,并以List的方式呈现给Sharepoint使用者。当然,Sharepoint的数据库不仅存放这些用户直接使用的数据,它还存放有Sharepoint的系统数据 : 如 Sharepoint场的配置数据(Configuration Data)、支持Sharepoint与外部数据源交互的BDC数据(用于支持BCS: Business Connectivity Services工作)。
可能有人就会问,为什么不直接使用数据库数据呢? 为什么非要在Sharepoint中以List方式绕一圈来表达?
这是因为Sharepoint Foundation的List与关系型数据库的数据表(Table)有以下方面的不同:
1、访问支持:
Sharepoint的数据访问不支持SQL,事实上,Sharepoint的数据是通过服务器端代码(server-side Code)如LINQ或CAML来访问的,你可以通过编程使用Server Object Model或者 LINQ来写入数据到List。
在客户端,你可以使用Client Object Model或WCF Data Services(即以前的ADO.NET Data Service)来访问List数据。
你不能使用SQL 查询语句或者存储过程(Store Procedure)来直接访问Sharepoint的后台数据
2、关联字段:
与数据表(Table)类似,列表(List)由字段(Column)组成,Column中的值既可以来自Column的值定义也可能来自其它List,对于后一种情况,Sharepoint就叫它查阅字段。
查阅字段是Sharepoint配置为从其他列表中的字段获取其值的字段。将查阅字段添加到列表会在该列表和提供数据的列表之间建立一种关系。这也类似于关系数据库中的关系型数据表之间的关系,但不同的是为查阅字段提供数据的List中的字段并不要求必须是外键字段(Foreign Key)。
当然,所有的Sharepoint Foundation定义的Lists都有一个ID字段,这个ID字段事实上就是建立查阅关系时要用到的外键字段(Foreign Key),没有这样的字段,你也不可能建立起查阅关系。
3、表联接 :
Lists 可以像关系数据表一样建立联接(Join),但建立联接的两List之间必须有查阅关系(Lookup Relation),否则这种Join就无法建立。也即:创建列表联接时要记住一些要求。您不能只是联接任何两个列表而不考虑类型。如果可以联接两个列表,就不仅仅是任何主字段和外字段可用作字段的联接对。主列表中的字段必须是 Lookup 类型的字段,它必须查找外列表中的字段。 出于此原因,所有联接都镜像列表之间的现有查阅关系。
4、附加信息:
Sharepoint Foundation的文档库(document library)是一种特殊的List,因为它的List记录可能会包括有文档附件(Attached Document)以及与此文档相关的描述字段(eg: 作者,创建时间,主题,最后修改者…….)。图片库也与此类似,只不过它的附件是以图片文件的方式提供。
从上面的大致比较我们就可以知道,由于Sharepoint的特殊要求,我们不可以照搬关系型数据库那一套,我们只有按照Sharepoint特殊要求来建立数据的组织与使用。
在Sharepoint中每个List都属于某个List Type,SharePoint Foundation包含有许多内置的List Type,比如: Announcements, Tasks, and Calendar等,用户可以直接拿来建立自己的List实例。
当然,开发人员也可以根据用户的特定要求创建用户自定义的List Type。
二、内容类型与字段类型(Content Types and Field Types)
1、内容类型(Content Types)
List中的记录条即List Item也是属于某种类型(Content Type)的,所谓Content Type就是内容类型,它是 Microsoft SharePoint Foundation 2010 列表或文档库中一类项目或文档的元数据(列)、工作流、行为以及其他设置的可重用集合。借助于内容类型,可以采用集中的可重用方式来管理一类信息的设置。
例如,假定这样一种业务情形:您具有三种不同类型的文档,分别为费用报表、采购订单和发票。所有这三种类型的文档都具有一些共同的特征;首先它们都是财务文档,并且包含的数据具有以货币表示的值。但是,每种类型的文档都具有各自的数据要求、各自的文档模板和各自的工作流。此业务问题的一种解决方案是创建四种内容类型(Content Type)。第一种内容类型"Financial Document"可以封装组织中所有财务文档共有的数据要求。其余三种内容类型("Expense Report"、"Purchase Order"和"Invoice")可以从"Financial Document"继承共有元素。此外,它们还可以定义每种类型特有的特征,如特定元数据集(meta data)、用于创建新项目的文档模板和用于处理项目的特定工作流。
使用Content Type的最简单的方式就是使用Sharepoint Foundation内置的Content Type。Sharepoint Foundation有许多内置的Content Type,如: Event 和 Announcement。开发人员也可以根据用户需要开发用户自定义的Content Type.
2、字段类型(Field Types)
列表中的字段(Field)也属于某种类型(Field Type字段类型),这种类型是不同于存储在此字段中的值(Value)的数据类型(Data Type 如:整型、字符串、日期等等)的。SharePoint Foundation 的字段类型的定义不仅包括基础数据类型(如:整型、字符串、日期等等),而且还包括这些数值是如何格式化,如何呈现的(如:创建、显示、编辑这个字段所呈现给用户的表单界面)。SharePoint Foundation有许多内置的字段类型,如:Modified By, Due Date等等。开发人员也可以开发用户自定义字段类型(Field Type)。
三、外部数据列表与BCS (External Lists and the Business Connectivity Service)
Sharepoint提供了强大的与外部数据源交互的能力,我们可以把诸如SAP,Oracle这样的外部数据库的数据资源呈现到Sharepoint界面上来。使用Sharepoint的Business Connectivity Services (BCS)不仅可以读取外部数据,而且支持写入。
下图显示了BCS中的主要组成部分及其它们之间的关系
Business Data Connectivity (BDC) Service 是新版本的业务数据目录,它之前是在 Microsoft Office SharePoint Server 2007 中提供的,现在在 Microsoft SharePoint Foundation 2010 中提供。
设计 BDC 的主要目的是,使您能够通过执行极少的编码工作,以声明方式从各种外部系统公开业务数据。
为实现此目标,BDC 通过元数据模型(该模型提供了一致的简化客户端对象模型)来提供对基础数据源的同类访问。
利用 BDC 服务,您能以声明方式对外部系统进行建模,以便您能公开 SharePoint Server 2010 中的外部数据(对于具有企业版客户端访问许可证的 Microsoft SharePoint Server 2010,也可在 Microsoft Office 2010 应用程序中执行此操作)。
BDC 填补了 SharePoint 网站和业务应用程序之间的间隙,使您能够将各种外部系统中的关键数据引入 SharePoint 列表(通过新的外部列表功能和外部数据列)、Web 部件、搜索、用户配置文件和自定义应用程序。
BDC 的核心功能是提供与各种外部系统的连接,并且它内部支持连接到以下类型的数据源:数据库、Windows Communication Foundation (WCF) 和 Web 服务、Microsoft .NET Framework 程序集、自定义数据源;
BDC 元数据模型(BDC 模型)是 BDC 的核心。类似于 Entity(外部内容类型)和用于提取有关外部系统的复杂详细信息的 Method 的数据结构统称为 MetadataObjects,并包含 BDC 模型。
外部系统的 BDC 模型实际上是一个 XML 文件,它是当您在 SharePoint Designer 中创建外部内容类型时自动生成的。在创建一个模型并将该模型上载到运行 SharePoint Server 的服务器上的 BDC 元数据存储之后,可随时在 SharePoint Server 中和 Microsoft Office 应用程序(例如,Microsoft Outlook、Microsoft SharePoint Workspace 和 Microsoft Word)中使用该模型中定义的外部内容类型,以使用 Business Connectivity Services 的演示功能和自定义解决方案根据上下文显示外部数据。我们可使用 SharePoint Server 管理中心内的"BDC 应用程序服务"页中的"导出"选项,或使用 SharePoint Designer 中的外部内容类型的"导出"选项随时查看 BDC 模型。
BDC 模型存储在关系数据库(此数据库不同于Content Database与Configuration Database)中,它在Sharepoint叫metadata store,在 BDC 运行时可以解释这些模型之前,需要将这些BDC 模型加载或具体化到内存中。数据库表和用于保留、读取和修改 BDC 模型的存储过程的集合构成了 BDC 元数据存储组件。只有在 Business Connectivity Services 的服务器部署上,此组件才会存在。
在BDC 模型存储到关系数据库Metadata Store之后,用户就可以通过多种途径使用它,比如:用户可以创建一个基于外部内容类型(External Content Type)的数据列表(List)。也可以基于已经存在的List向其添加一个来自于外部内容类型的新字段。SharePoint Server 2010在BCS方面有许多加强,它包含一些内置的Webpart来使用External Data,包括搜索外部数据。此外,SharePoint Workspace与Microsoft Office的客户端应用程序也能做到直接获取外部数据。在SharePoint Server 2010中,用户还能做到索引与搜索外部数据源(External data sources)
当某个Sharepoint的客户端应用程序请求外部数据时,运行在前端Web服务器上的BDC运行时(BDC Runtime)会向本地的缓存(Locally Cache)请求BDC 模型数据,这些BDC 模型数据是从BDC metadata store中复制到缓存以提高运行效率的。BDC运行时在得到此模型数据后就可以向客户端应用程序提供针对外部数据的相关操作了。与此类似,在客户端也缓存得有BDC 模型数据,BDC的客户端运行时(BDC Client Runtime)会基于此BDC 模型数据提请外部数据访问请求。当然,申请到的外部数据会保留在客户端以支持客户端的离线操作。
在BDC 服务启动起来并且所需的BDC模型数据也成功注册后,最终用户就可以使用外部数据了。他们既可以使用无代码方式(non-code)使用外部数据,也可以采取比较复杂的编程方式来使用外部数据。BDC运行时提供了一整套API来支持开发人员通过开发WebPart或其它解决方案与外部数据源交互。
由于BDC模型数据提供了一个类似于中间层的机制,当通过代码访问和操作外部数据源数据时,即使是针对不同的数据源对象,Sharepoint也能使用相同的代码作相关访问,BDC模型数据会自动把这个操作转化为针对不同数据源的具体的对应操作,这样就保证了在Sharepoint端访问数据的一致性表达,也就是说你可以使用同一套BDC运行时提供的API来访问外部数据,而无需根据外部数据源的不同使用不同的API。
需要注意的的BDC解决方案是在场级别进行打包和部署的,你不可以在沙盒方案中创建和部署与BDC。