哪种方法更适合这种情况?

时间:2010-08-25 19:54:01

标签: sql-server sql-server-2008 unique-index

我们有下表:

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列ot允许空值并创建一个唯一的文件索引,以便不包含空值,并允许表格变得更大更快。
  2. 创建一个单独的表格,用于跟踪此特定用途的所有广告系列。
  3. 请注意,CampaignCustomer表经常用于兑换优惠券和插入新优惠券。最重要的是,我们不希望我们的客户兑换优惠券并等待他们放弃或其他流程失败。那么,从效率的角度来看,您认为哪种选择最好,为什么?

2 个答案:

答案 0 :(得分:4)

我会选择过滤后的索引...你要存储相同的数据,所以请将它保存在同一个表中。

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

你有400万行的问题吗?对于如此狭窄的表格而言,这并不是那么多。

答案 1 :(得分:2)

  1. 为了单个列,我反对重复的表
  2. 允许couponcode为null意味着有人可能会意外地创建一个值为NULL的记录,当它应该是有效的优惠券时
  3. 我会创建一个couponcode来表示非优惠券,而不是使用指标列“isCoupon”或“isNonCouponCampaign”,并使用过滤后的索引来忽略“nocoupon”值。

    这导致我的下一个观点 - 我没有看到外键引用,但知道哪些优惠券存在以及实际使用哪些优惠券是关键。现有表中的某些列可以移动到父优惠券表...