2013-11-26 31 views
2

我有此查詢SQL Server 2008上Sql Server的行大小限制,表的設計

CREATE TABLE MediaLibrary 
(
MediaId bigint NOT NULL IDENTITY (1, 1), 
MediaTypeId smallint NOT NULL, 
ImageNameByUser nchar(100) NULL, 
GeneratedName uniqueidentifier NOT NULL, 
UploadedByUserId uniqueidentifier NOT NULL, 
UploadedDate date NOT NULL, 
ProfilePhoto bit NOT NULL, 
PublicPhoto bit NOT NULL, 
AppointmentId bigint NULL, 
OriginalImage nchar(1000) NULL, 
ThumbImage nchar(1000) NULL, 
MediumImage nchar(1000) NULL, 
LargeImage nchar(1000) NULL, 
UrlThumb nchar(1000) NULL, 
UrlMedium nchar(1000) NULL, 
UrlLarge nchar(1000) NULL, 
InactiveReasonId smallint NULL, 
InactiveDate datetime NULL 
) ON [PRIMARY] 
GO 

當我試圖創建表我得到這個錯誤

創建或更改表「MediaLibrary」因爲最小行大小將是14273,包括9個字節的內部開銷。這超過了8060字節的最大允許錶行大小。

我知道我在行大小上達到了極限,但這不是一個大表,所以我想知道這是不是一個好的設計?

當我改變了nchar(1000)varChar(1000)表保存的罰款。我擔心的是,一旦數據實際上被保存到表格中,我將再次達到行大小限制。

+0

'的nchar(1000)'是一個**非常糟糕的主意** - 它會** **總是使用2000個字節的存儲空間 - 即使你只存儲「一」裏面。 'nchar(n)'是簡短的(最多3個,也許5個字符)字符串,例如。 ISO貨幣代碼等;但對於更長的文本片段,您應該**總是**使用'(n)varchar(x)'數據類型,它只存儲真正存在的內容! –

回答

5

假如你不打算來填充所有列,您需要使用爲nvarchar(或只是爲varchar),而不是NCHAR(或字符)。原因是nchar(1000)需要保留2000字節,無論你是否要使用它。對於varchar/nvarchar,這不是真的。

現在,如果你將可能有1000個字符,每一個欄目,它不會不管你使用什麼數據類型。原因是SQL Server中的基本存儲元素是一個8K頁面。所以這是不可能的存儲一行超過〜8K以上(有一些頁頭開銷以及可能取決於列數據類型可以使用其他位)。的解決方法是典型地:

  • VARCHAR(最大值) - 其可以存儲不適合行外的二進制大對象數據,但有一個性能開銷爲此,也可以引入一定的侷限性,例如網上執行能力重建
  • 變化表結構,使得這些URL被存儲在一個單獨的表的不同行中。例如:

    CREATE TABLE dbo.Media 
    (
        MediaID BIGINT IDENTITY(1,1) PRIMARY KEY, 
        MediaTypeID SMALLINT NOT NULL, 
        ImageNameByUser NVARCHAR(100) NULL, -- should also not be nchar 
        GeneratedName UNIQUEIDENTIFIER NOT NULL, 
        UploadedByUserId UNIQUEIDENTIFIER NOT NULL, 
        UploadedDate date NOT NULL, 
        ProfilePhoto bit NOT NULL, 
        PublicPhoto bit NOT NULL, 
        AppointmentId bigint NULL, 
        InactiveReasonId smallint NULL, 
        InactiveDate datetime NULL 
    ); 
    
    CREATE TABLE dbo.URLTypes 
    (
        URLTypeID TINYINT NOT NULL PRIMARY KEY, 
        Description NVARCHAR(32) NOT NULL UNIQUE 
    ); 
    
    INSERT dbo.URLTypes VALUES(1,'OriginalImage'),(2,'ThumbImage'),...; 
    
    CREATE TABLE dbo.MediaURLs 
    (
        MediaID BIGINT NOT NULL FOREIGN KEY REFERENCES dbo.Media(MediaID), 
        URLTypeID TINYINT NOT NULL FOREIGN KEY REFERENCES dbo.URLTypes(URLTypeID), 
        URL VARCHAR(2048) NOT NULL 
    ); 
    

順便說一句,你真的需要爲支持Unicode的網址嗎?

+0

編號該URL並且只是服務器端文件位置的副本。我可能只需要保存一個或另一個。這也會在桌子上敲3排。也是每列都有通向拇指,中等,大的路徑。我已用1000填充,這也可能是填充太多,但認爲更好,但更多更少。由於我知道文件夾結構,並且我可以在託管服務器上獲得路徑,所以我可以將其計算在更接近的填充範圍內。 – ChampChris

+0

編輯是我想要去的另一種方式。謝謝! – ChampChris

+0

1最後一個問題是最好存儲URL而不是服務器路徑。好像過度殺人。 – ChampChris