1

我们有下表:

CREATE TABLE [dbo].[CampaignCustomer](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CampaignID] [int] NOT NULL,
    [CustomerID] [int] NULL,
    [CouponCode] [nvarchar](20) NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [ModifiedDate] [datetime] NULL,
    [Active] [bit] NOT NULL,
 CONSTRAINT [PK_CampaignCustomer] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

和以下唯一索引:

CREATE UNIQUE NONCLUSTERED INDEX [IX_CampaignCustomer_CouponCode] ON [dbo].[CampaignCustomer] 
(
    [CouponCode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 20) ON [PRIMARY]
GO

我们使用 CouponCode 和其他外键(为简单起见,上面未显示)进行非常持续的查询。CampaignCustomer 表有近 400 万条记录并且还在不断增长。我们还开展不需要优惠券代码的活动,因此我们不会插入这些记录。现在我们还需要开始跟踪这些活动以用于其他目的。所以我们有两个选择:

  1. 我们将 CouponCode 列更改为允许空值,并创建一个唯一的过滤索引以不包含空值并允许表变得更大更快。
  2. 为此特定目的创建一个单独的表来跟踪所有活动。

请记住,CampaignCustomer 表经常用于兑换优惠券和插入新优惠券。底线是我们不希望我们的客户兑换优惠券并一直等到他们放弃或其他流程失败。那么,从效率的角度来看,您认为哪个选项最好,为什么?

4

2 回答 2

4

我会选择过滤后的索引......您正在存储相同的数据,因此请将其保存在同一张表中。

当您可能不需要拆分表并增加复杂性时,拆分表就是重构。

你有 400 万行的问题吗?尤其是对于这么窄的桌子来说,这并不多

于 2010-08-25T20:02:19.457 回答
2
  1. 为了一列,我反对重复表
  2. 允许couponcode为空意味着有人可能会意外地创建一条记录,当它应该是一个有效的优惠券代码时,它的值为 NULL

我将创建一个couponcode指示为非优惠券而不是诉诸指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤索引来忽略“nocoupon”值。

这就引出了我的下一点——我没有看到外键引用,但它是了解存在哪些优惠券以及实际使用了哪些优惠券的关键。现有表中的某些列可以向上移动到父优惠券代码表...

于 2010-08-25T20:08:54.403 回答