ActivityForm
和
Field
它们通过
ActivityFormField
ActivityFormFieldValidator
表将与具有多对一关系的
活动表单字段
桌子,所以我们给
活动表单字段
表中的标识列(“ActivityFormFieldId”)。这
活动表单字段
该表还包含给定字段在给定活动窗体上显示的顺序等信息。
预期用途如下:
-
-
活动表单字段
给定的表
ActivityFormId
领域
和
活动表单字段验证器
桌子。
-
新
活动表单字段
条目将每隔一段时间创建一次,但不会像上面提到的查询那样频繁。
我最初的反应是使用以下键和索引配置ActivityFormField表:
-
标识列上的主键,上面有聚集索引。
-
FieldId
和
活动表单ID
除了给我感觉最“正确”或“正常”之外,这还满足了以下基本要求:
-
活动表单字段
和
领域
-
活动表单字段验证器
要附加的条目,以及
-
活动表单ID
活动表单字段
条目不应导致实际数据的任何重新排序。
然而,考虑到我们计划使用该表的方式,我想知道是否有另一种键、索引和集群的组合可能更有效?
更新
经过一些额外的研究和思考,我倾向于让我的表声明看起来像这样:
CREATE TABLE [ActivityFormField](
[ActivityFormFieldId] [int] IDENTITY(1,1) NOT NULL,
[ActivityFormId] [int] NOT NULL,
[FieldId] [int] NOT NULL,
[SortOrder] [tinyint] NOT NULL,
CONSTRAINT [PK_ActivityFormField] PRIMARY KEY NONCLUSTERED
(
[ActivityFormFieldId] ASC
),
CONSTRAINT [UK_ActivityFormField_ActivityForm_Field] UNIQUE NONCLUSTERED
(
[ActivityFormId] ASC,
[FieldId] ASC
)
)
ALTER TABLE [ActivityFormField] WITH CHECK ADD CONSTRAINT [FK_ActivityFormField_ActivityForm] FOREIGN KEY([ActivityFormId])
REFERENCES [ActivityForm] ([ActivityFormId])
ALTER TABLE [ActivityFormField] WITH CHECK ADD CONSTRAINT [FK_ActivityFormField_Field] FOREIGN KEY([FieldId])
REFERENCES [Field] ([FieldId])
CREATE UNIQUE CLUSTERED INDEX IX_ActivityFormField_ActivityForm_SortOrder ON [ActivityFormField]
(
[ActivityFormId] ASC,
[SortOrder] ASC
)
CREATE NONCLUSTERED INDEX IX_ActivityFormField_ActivityForm ON [ActivityFormField]
(
[ActivityFormId]
)
CREATE NONCLUSTERED INDEX IX_ActivityFormField_Field ON [ActivityFormField]
(
[FieldId]
)
这种方法在标识字段上使用非聚集索引,在最常用的查询检索数据的条件和顺序上使用聚集索引,并使用约束来确保只有一个
活动表单字段
条目存在以下任意组合
和
领域
。内部显然以相同的方式处理唯一约束和索引,因此我选择了一个约束来表明它的主要目的是保持事物的唯一性。根据HLGEM提出的逻辑,其他指数“以防万一”。