2010-08-25 178 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

相關問題