2009-08-06 206 views
2

我開始一個新的項目,而我在我的SQL Server 2005數據庫中使用別名數據類型,常見的表列考慮。對於例如我將定義的別名的數據類型以保持對象的名稱,如下所示:SQL別名數據類型

CREATE TYPE adt_Name FROM VARCHAR(100)不爲空

然後將其用於表的列的定義,確保我所有的列共享完全相同的定義(長度,可空性,精度等)。

  1. 使用別名數據類型的優點是什麼?
  2. 使用別名數據類型的缺點是什麼?
  3. 你會推薦什麼樣的命名約定?我在想adt_Xxx(adt =別名數據類型)。
  4. 爲什麼SQL Server 2005 Management Studio不允許我使用來自GUI的別名數據類型。我只能通過SQL腳本使用它們。 GUI不會在任何下拉框中列出它們 - 令人沮喪。
  5. 別名數據類型的使用會如何影響我的Linq to SQL模型?

回答

6

優點:

  • 可重複使用和可共享的ADT是它的創建中,如果你想在您的所有數據塊,然後在模型數據庫中創建它的數據庫中可重複使用的

  • 執行,該ADT將執行它的基本類型的特徵,長度和爲空,並且可以用於執行開發標準

  • 隱組合不允許共nversions,抽象數據類型不能轉換或轉換

  • 簡單,與其它語言的ADT借給簡單性開發和維護

  • 數據隱藏

缺點:

  • 不可修改,ADT不能直接修改,您必須刪除並重新創建EM。請注意,您仍然可以將它們所在的表更改爲另一個基本類型或ADT,然後刪除並重新創建它們,然後將表更改回來(或者只是創建一個新表來更改它們)。

  • 沒有工具,ADT的必須與使用CREATE語句直接查詢創建(sp_addtype已被棄用,不應該使用)。

  • 表變量不支持

命名規則:

  • 'adt_' 看起來像它會工作得很好

LINQ到SQL:

  • 將這些類型作爲基礎輸入您的querys,或創建相應的類型使用
1

類型一般都很好,但我們的項目使用它有限,所以我可以回答#2 問題是「改變」。我們開發了類型爲varchar(255)的TUrl,但過了一段時間我們試圖改變爲varchar(800)。對於工作數據庫是不可能的。

我不知道使用別名數據類型的任何其他缺點。

6

我會建議反對。我支持一些擁有使用它們的產品的客戶,他們是一個持續的PITA(腳踝疼痛)。

尤其是,您不能在#temp表中使用它們,除非您在TempDB中定義它們。由於每次重新啓動SQL Server時都會重置TempDB,這意味着每次重新啓動SQL Server時都必須重新定義它們。但這意味着一個啓動程序,必須在主人,並有一定的特權。而且,由於別名定義(真的是女士術語中的UDT)可能會改變,這意味着DBA必須授予其他人權限來編輯該過程,這可能是一個安全問題。

呵呵,爲了避免我忘了,如果您必須升級,遷移或重新安裝服務器,您需要將此proc的外部副本重新添加到Master,您需要記住這樣做。

然後有一些限制:根據我的經驗,開發人員想要使用這些「別名」,因爲他們認爲如果他們需要,他們可以靈活地改變定義。它不會。持久性數據不像持久性代碼,它沒有這種靈活性,SQL Server在這裏根本不會幫你什麼忙。在你嘗試完成一次之後,你很快就會得出結論,你從來不應該使用這些東西。

1

IMO使用內置的類型是頸部巨大的痛苦。其他人已經給出了足夠的理由。我正在使用C風格的宏。舉例來說,在我的SQL 2000的代碼,我在一個單獨的文件macros.h以下行

#define WIDEST_CHAR VARCHAR(8000) 

如下,我會用它:

#include "macros.h" 

(snip) 

CREATE TABLE dbo.Comments(CommentID INT NOT NULL, 
Comment WIDEST_CHAR, 
... 

和宏WIDEST_CHAR將VARCHAR被替換(8000)由預處理器。當我遷移我的系統到2005年,我簡單地更換宏定義與

#define WIDEST_CHAR VARCHAR(MAX) 

和我所有的設置。