表SaaS项目的索引考虑因素

时间:2015-08-01 08:48:04

标签: sql-server database-design indexing saas primary-key-design

很高兴听到你们了解如何最好地考虑索引策略,因为这些表中的数据可能会在未来的时间内大幅增长。决定通过在单表方法中存储多租户数据来继续。举个例子,我只讨论了几个表。

CREATE TABLE [dbo].[TenantID](
    [TenantID] [smallint] IDENTITY(1,1) NOT NULL,
    [TenantName] [varchar](128) NOT NULL
) 
CREATE TABLE [dbo].[MenuType](
    [MenuTypeID] [int] IDENTITY(1,1) NOT NULL,
    [TenantID] [smallint] NOT NULL,
    [MenuTypeName] [varchar](128) NOT NULL
) 
  • 每个租户的MenuTypeName应该是唯一的。因此,我会有一个 TenantID和MenuTypeName的唯一索引
  • TenantID应引用Tenant表。所以, TenantID上的外键
  • 我还在考虑是否应该使用主键或仅使用MenuTypeID上的聚集索引这是一个自动增量列。
  • 将来,当表格大小增加时,我应该能够轻松地将基于TenantID的数据分区到新的数据库服务器。

问题:

  1. 我真的需要在MenuTypeID上定义主键,因为我们知道SQL Server保证增量种子。我可以在MenuTypeID上定义一个Clustered Index。
  2. 在TenantID和MenuTypeName上定义唯一键。
  3. 使用这种方法,我不会在表格设计中使用主键概念。但是,我想知道我将来是否因为没有主键而引发麻烦?

1 个答案:

答案 0 :(得分:0)

虽然SQL Server应分配增量IDENTITY值,但仍可以使用IDENTITY_INSERT ON引入重复项。考虑对 TenantID MenuTypeID 的复合主键约束,以保证主键是唯一的,并且对 TenantID MenuTypeName <的唯一约束/ em>确保 MenuTypeName 对每个租户都是唯一的。仅MenuTypeID上的唯一索引/约束在此处没有任何值,假设它从未在没有TenantID的情况下使用。

为其中一个约束索引指定CLUSTERED。聚集索引的最佳选择取决于您最常见的查询。如果有疑问,通常最好将主键索引作为群集索引。