2010-08-25 119 views
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万条记录并且在增长。我们还开展不需要优惠券代码的广告系列,因此我们不会插入这些记录。现在我们还需要开始跟踪这些广告系列以及其他目的。所以我们有2个选项:

  1. 我们更改CouponCode列不允许空值,并创建一个唯一的文件索引,使其不包含空值,并允许表增长得更大更快。
  2. 创建一个单独的表格,用于跟踪此特定用途的所有广告系列。

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

+0

没有CouponCode的活动有多少(百分比)? – 2010-08-25 19:59:15

+0

16.5%的广告系列没有优惠券代码。 – 2010-08-25 20:17:17

+0

有了这个比例,我会去选项1.但是,而不是空值,我会使用虚拟代码,指示无优惠券记录。你可能会考虑分区表...... – 2010-08-25 20:22:05

回答

4

我会去筛选索引...你存储相同的数据,所以保持在同一个表。

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

你有400万行有问题吗?这并不是说很多特别是对于此类条案

+0

我们现在没有400万行存在问题。我们应该什么时候开始担心桌子的大小?我们不会存储相同的数据,但类似。 – 2010-08-25 20:10:55

+0

那么你仍然可以使用分区表来克服性能问题...... – 2010-08-25 20:20:03

2
  1. 我反对对单个列
  2. 允许couponcode为空的缘故重复表意味着有人可能会意外地创造了纪录,其中值为NULL时,它应是一个有效的COUPONCODE

我会创建一个couponcode指示作为一个非优惠券,而不是采取指示符列“isCoupon”或“isNonCouponCampaign”,并使用经滤波的指数忽略“nocoupon”值。

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

+0

所以你说,而不是使用NULL,只需插入“nocoupon”并筛选唯一键? – 2010-08-25 20:13:43

+0

@Jonas Stawski:是的。我忘了它会被复制并打破你的独特约束。 – 2010-08-25 20:18:23

+0

但过滤就可以解决这个问题 – 2010-08-25 20:22:45

相关问题