在 SharePoint 2010 中的列表关系
SharePoint 2010 使您可以创建列表中相同的站点集合之间的关系。通过查阅列 (如称为查阅字段) 相关列表实例。此功能的真正的好处是 SharePoint 2010 允许您在join语句中使用 LINQ to SharePoint 或协作应用程序标记语言 (CAML) 中查询跨列表查询列关系定义的位置。默认情况下,SharePoint 允许最多 8 个连接每个查询,但管理员可以更改此限制通过管理中心 Web 站点或通过使用 PowerShell。然而,包含大量的 join 语句的查询是资源密集型和超过八个联接每个查询很可能会产生重大的不利影响性能。
跨列表查询此新引进的能力带来了 SharePoint 数据模型更接近于关系数据库的功能,尽管 SharePoint 支持联接谓词只在查阅列之间存在关系列表。在这方面,在 SharePoint 中的联接功能是 SQL 中的联接谓词比不那么强大。
解释的查阅列
假设您使用关系数据库来管理货物收到您的客户的订单。数据库可能包括为 Orders,后者存储您已收到的订单,一个表和一个名为订单行,存储包括订单的各个项的表。
不相关的数据库表
表表相关,可以将订单 id 列添加到订单行表,并使用此列来定义表之间的外键关系。
数据库表的外键约束 (主键) 链接
或者,您可以将 orderno 列添加到订单行表,并使用此列来定义外键关系 (提供订单表中的 orderno 列唯一值的约束)。
数据库表的外键约束链接
定义的外键关系有助于确保引用的完整性 — — 订单行表的订单 id 列在第一个示例中,只能包含在订单表中的 ID 列中找到的值。您还可以进一步施加条件的外键关系。例如,当从订单表中删除项目,您可以强制数据库引擎将从订单行表中删除相应的行。相反,您可以禁止删除链接到订单表中的活动行的订单行项目。
在 SharePoint 中的查找列关系都是在概念上类似于关系数据库中的外键约束,但有关键区别。假设您想要在 SharePoint 数据模型中实现前面的示例。首先,您创建的订单列表。接下来,定义一个网站查阅列,从命令列表中检索值。最后,您创建订单行列表,您将添加订单从检索值的查阅列。当用户输入的订单行列表的一个新的命令行时,他们会选择使用查阅列的相关的订单。你不能在订单中选择哪一列或订单行列出驱动器外键约束 — — 在 SharePoint 列表中,您可以查看内置在 ID 列中作为一个永久的、 不可更改的主键 ;这是驱动器关系的价值。相反,您选择的列中的目标列表中您想要显示在源列表中,通过将ShowField属性设置。当用户将数据添加到源列表中时,他或她可以选择从列表中选择了目标列表中的列中的值。下面的插图显示这。
SharePoint 列表的查阅列关系
另一个关键区别是在关系数据库中,您可以应用外键约束到现有数据。这并不总是好的做法和需要照顾,纠正违反约束的任何现有的数据行。然而,在 SharePoint,您没有此选项 — — 您不能将现有的列转换为查阅列。您必须首先创建查阅列,然后,用户必须通过从目标列表中选择值填充数据。请注意查找列定义本身没有定义的关系,直到您将其添加到列表中。例如,您可以创建查阅字段作为网站列。查找列定义有效地定义了一个半的关系。
查找列定义
每当您将网站栏添加到列表,您有效地创建独特的源列表和目标列表之间的外键关系。在查阅列列表之间的关系是 SharePoint,不通过管理基础数据库。您也可以将查阅列空白除非它被标记为必需的字段,则外键约束总是需要一个值。
如果您想要使用 SharePoint 列表的多对多关系的模型,您必须创建一个中间的列表,以使关系正常化。这是在概念上类似于正常化进程在数据库设计中,那里还使用一个中间表的多对多关系的模型。例如,假设您想要的模型部件和机器之间的关系。部分可以找到许多机器和一台机器可以包含许多部件。关系正常化,将创建名为 PartMachine,中间的列表中,如下图所示。
使用中间的列表中,模型的多对多关系
在此示例中,中间的列表中,PartMachine,包含链接到这两个列表的查阅列。要创建部件和机器之间的关系,您需要在 PartMachine 列表中创建一个条目。从部分导航到计算机,或反之亦然,您要浏览 PartMachine 列表。从用户体验的角度来看,这是不甚理想,所以在这一点上,您将可能添加自定义逻辑和自定义用户界面组件,以保持部件和机器之间的关联。
可以以编程方式使用 CAML 或 LINQ to SharePoint 导航 SharePoint 列表之间的关系。有关详细信息,请参阅SharePoint 2010 中的数据访问.
创建和使用查阅列
您可以创建查阅列三种不同方式 — — 以交互方式通过 SharePoint 网站设置用户界面 (UI),通过SPFieldLookup类以编程方式或以声明方式通过加枫。例如,下面的 CAML 代码以声明方式定义命名返回命名的项目列表中的项目的项目查找查阅列。
<Field ID="{3F55B8CF-3537-4488-B250-02914EE6B4A8}" Name="ProjectsLookup" DisplayName="Projects Lookup" StaticName="ProjectsLookup" DisplaceOnUpgrade="TRUE" Group="SiteColumns" ShowField="Title" WebId="" List="Lists/Projects" Type="Lookup" Required="TRUE"> </Field>
感兴趣的查阅列的属性如下所示:
- 类型属性的值必须设置为查找.
- WebId属性指定包含目标列表中的站点的内部名称。如果该属性是省略或设置为空字符串,SharePoint 将假定该列表是在网站集的根网站上。
- 列表属性指定目标列表中的站点相对 URL。在定义该字段之前,必须存在此列表实例。
- ShowField属性中指定的列在目标列表中包含您想要显示在查阅列中的值。
注意:
考虑挑选有意义的ShowField值,是不可能改变的查阅列。例如,选择一种产品 SKU 或型号是比描述字段的关系更好的基础。
列表中的列、 网站栏和内容类型
作为网站列或列表的列,您可以定义一个查阅列。如果您定义了一个查阅列,以声明方式或编程方式,您必须小心确保目标列表 (换句话说,指的是列的列表) 位于在资源调配过程列中相应的点的位置。无论是否您作为网站列或列表的列定义一个查阅列,目标列表中必须已经存在在创建列时点 — — 否则,列将不可用。同样,如果您作为列表中定义的一部分定义一个查阅列,目标列表中必须已存在点的您提供包含查阅列的列表。
查阅列定义列表的两个实例之间的关系,因为它往往可以感来定义您查阅列在列表级别。有某些情况下是有意义要使用网站栏和内容类型。例如,如果在相同的站点集合内的许多类似列表将包括关系到根站点上的列表,可以定义站点列查找、 包括它在内容类型中,和调配到网站集内的多个列表的内容类型。
预计的字段
除您在ShowField属性中标识列,SharePoint 2010 使您能够在包含查阅列的列表视图中显示目标列表中的其他列。这些额外的列被称为预计字段。例如,假设您使用 SharePoint 列表到模型员工和他们的部门之间的关系。您创建员工列表的查阅列一部。您可能还要部经理名称显示在列表中的雇员,如下面的插图所示。
预计在 SharePoint 列表中的字段
注意:
这是一个有点牵强的例子,因为在现实中,部门经理可能不该员工的经理和部门经理也将成为成员的雇员表。然而,它足以说明预计的字段的概念。
强制执行列表中的关系
SharePoint 2010 可以帮助您保持您的数据模型中的参照完整性通过强制执行定义的查阅列的关系。就像在关系数据库中的外键约束,SharePoint 允许您配置限制删除和级联删除规则查找列之间的关系:
- 级联删除规则自动删除引用的记录,当您删除该记录的项目。这条规则通常用于强制实施的父-子关系。
- 限制删除规则阻止您删除记录所引用的另一个列表中的查阅列。这条规则通常用于强制实施对等关系。
父-子关系和级联删除规则
在父-子关系中,一些记录孩子的其他记录。毫无意义,如果没有有效的父记录的子记录。例如,开票系统可模拟发票和发票行项目之间的关系。发票行项目,其中描述了购买的产品、 订购的数量和单位成本,是子记录的发票项目,它描述了客户、 送货地址、 总成本,等等。
若要创建发票和发票行项目之间的关系,会到 InvoiceLineItems 的列表中检索发票编号从发票列表中添加一个查阅列。发票行项目是无父发票毫无意义,因为它将适当配置要级联删除的查阅列。这将确保当用户删除发票,SharePoint 会删除相应的行项目。
没有有效的父的子项目通常被称为孤儿。级联删除行为被为了防止发生孤儿。
对等关系,并限制删除规则
在对等的关系的相关实体之间没有清晰的层次结构。例如,假设要在我们发票行项目列表中,包括从产品列表中检索项的查阅列。在这种情况下,该产品是向儿童既发票明细项目的父 — — 产品查找只是发票行上提供的其他信息。
假设你删除产品记录,因为您不再出售的产品。因为历史的发票行项目现在将引用不存在的产品记录,这会破坏你的数据模型的参照完整性。更好的方法是标记为非活动状态,如果不再可供分配的产品记录。在这种情况下,宜在 InvoiceLineItem 列表中来限制删除配置产品查阅列。这可以确保无法删除产品记录,如果已在发票明细项目中引用它。
使记录处于非活动状态,同时确保它为了与历史记录保持一致,仍然可以访问通常称为软删除。
您可以配置列表关系行为通过用户界面以交互方式或以编程方式在功能接收器类中。因为列表关系行为是特定于单个列表实例,不能在列定义或内容类型中以声明方式配置此行为。如何配置级联的详细信息,删除并限制以编程方式删除规则,请参阅如何: 以编程方式设置查阅字段删除行为.