Sql-Server

當其中一個值的類型不同時,在復合鍵中使用的最佳類型

  • November 14, 2011

我正在為已被抓取的多個部落格網站的內容建構數據儲存。這些站點中的每一個都將在表中具有一個Blog條目

BlogId                  Url                         Version
int, PK, identity       varchar(2500), not null     int, not null
-----------------       -----------------------     -------------
               1       'http://site1.com/                      1
               2       'http://site2.com/                      1
               3       'http://site2.com/                      2

然後會有一個Post表:

BlogId                Url                        PostId
int, FK, not null     varchar(2500) not null     ?

對於我正在查看的大多數部落格,我可以很容易地辨別出PostId對他們來說獨一無二的價值。

對於所有部落格,值Url將是唯一的BlogId。但是,Url經常會發生變化

但是,有一些部落格PostId在抓取 HTML 時無法辨別出好的價值。在這些情況下,我可以獲得datetimeoffset發布文章的內容。發布頻率的準確性在分鐘級別。

問題是,我需要使用BlogIdPostId但我不確定我應該輸入什麼PostId。我一直在考慮兩種選擇:

  • sql_variant- 我可以int在我的大多數網站上使用 ,這很好,然後datetimeoffset用於那些我無法輕易辨別唯一數字的網站PostId
  • bigint-PostId適合在這裡,我可以將其編碼datetimeoffsetbigint2011-11-11 13:59將成為201111111359
  • 或者我沒有想到的其他方法。

其他一些關鍵事實:

  • Post表最初只有幾千條記錄(如果有超過五千條,我會感到驚訝)
  • 有標籤、類別等相關的表,會和這個表連接(可能最多幾千條記錄)
  • 這些表中的任何一個的增長都不會是天文數字。 也許每年還有五千張唱片(這對我來說是保守的,但你永遠不知道)
  • 該鍵僅用於創建索引/約束,目前,我預計不會在查詢中使用它(我連結的其他屬性更受關注)。

我什至不會考慮將不同類型的數據強製到一個欄位中。

另外一個選擇:

  • 合成 post_id 和
  • “native_post_id”的每個“類型”的子表

如有必要,有多種方法可以強制執行這些子表和父表之間的子集關係

我可能誤解了您對 PostId 的預期用途。大概它會像查詢字元串(或 MVC 風格的友好 URL 後綴)一樣用於檢索或連結到其首頁上的原始文章?

如果 PostId 值僅用作字元串,即在提供由 URL + PostId 串聯組成的 URI 的上下文中,那麼您最好將其保存為字元串,因為這是唯一的您將要使用它的上下文。

由於這只是一個自然鍵而不是您的主鍵,正如您所說,這應該可以完成工作而不會太優雅

另一方面,如果您打算對 PostId 進行某種其他類型的處理(字元串連接除外),那麼您可能不應該將 PostId 保存為字元串,除非您保留某種分區屬性來告訴您哪個內部函式您需要執行字元串以獲得類型安全的值。如果您遇到這麼多麻煩,您不妨保留多個不同類型的 PostId X列以滿足您的需求。

引用自:https://dba.stackexchange.com/questions/7810