2013-11-26 4 views
2

таблицы У меня есть этот запрос на SQL Server 2008Sql 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 (или char). Причина в том, что 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 для URL-адресов?

+0

№ URL-адрес и это всего лишь дубликат расположения файла на стороне сервера. Мне, вероятно, нужно только сохранить тот или иной. Это также выбило бы 3 строки за столом. Также да, у каждого столбца будет путь к Большому пальцу, средний, большой. Я наполнился 1000, что также может быть слишком большим, но лучше было иметь больше и меньше. Поскольку я знаю структуру папок, и я могу получить путь на сервере хостинга, я могу считать это до более близкого диапазона отступов. – ChampChris

+0

EDIT - это другой способ, о котором я думал. Благодаря! – ChampChris

+0

1 последний вопрос - лучше всего сохранить URL-адрес, а не путь к серверу. Похоже на убийство. – ChampChris

Смежные вопросы