2011-11-23 64 views
1

我即將創建一個將保存客戶ID(GUID),數據點(字符串)和輸入時間的表。但是,我無法弄清楚如何最好地把它關鍵。我不能保證三元組ID /字符串/時間是唯一的(表格將包含用戶輸入,並且我們預見到一些用戶將嘗試腳本表單提交,因此時間可能沒有足夠的分辨率)。沒有主鍵或代理鍵?

我們將盡查找此表中很多時候,所以查詢速度是非常重要的。另一方面,插入物也不能完全癱瘓。

所以,我看到兩個選擇:要麼去無主鍵,或定義了代理自動增量鍵。鑑於上述要求,最好是什麼?我可以爲三個數據列使用代理鍵和非唯一索引嗎?

我們使用SQL Server 2008 R2。

+3

*如果它沒有主鍵,這不是一個表* .... –

+3

我想創建一個自動增量領域,並將此作爲主鍵。然後只需索引其他3列。一個索引可能已經足夠,這取決於您打算如何搜索表格 – Andrew

+0

客戶ID +時間似乎很明顯會成爲一個獨特的組合!然而,這是一個毫無意義的問題,你會對自動增量更好。 –

回答

0

除非您有充分理由不這樣做,否則默認您的數據庫設計使用使用smallint/int/bigint的代理主鍵與IDENTITY屬性集合適合,以便它會生成自動創建的主鍵值。如果稍後決定要使用表中的一個或多個列強制使用自然鍵,則可以通過創建唯一約束來實現。

雖然可以沒有,有一個或多個唯一約束桌子上,你只能有一個主鍵,所以用它作爲代理主鍵,避免了很多其他的問題在這樣做。

0

那麼,什麼是有這樣的行的表呢?

customer_id       data_point  time_entered 
-- 
6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 
6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 
6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 

而且是什麼有一個像行的表這是什麼意思?

id customer_id       data_point  time_entered 
-- 
1 6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 
2 6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 
3 6F9619FF-8B86-D011-B42D-00C04FC964FF some data  2011-11-23 10:02:12.34567 

如果你沒有很好地回答了第一個問題,你掛在那個表中的ID號之前,你不會有一個很好的答案後,無論是。

+0

在這種情況下,「意思」是什麼意思?它們都意味着客戶以非常高的頻率(腳本)輸入了一些數據。這些用戶可能會很快被禁止,但他們會發生。數據點是一個令牌,它會給用戶一些獎勵,我們需要能夠看到用戶輸入的所有令牌以及何時。所以表格本身對我有意義,但我不確定在沒有索引時會發生什麼。我們不能確定這些行將是唯一的。代理鍵除了唯一性外不會添加任何內容。 – carlpett