Чи є недоліки завжди використовувати nvarchar (MAX)?


342

Чи є недоліки в SQL Server 2005, щоб зробити всі поля символів nvarchar (MAX), а не чітко вказати довжину, наприклад, nvarchar (255)? (Крім очевидного, що ви не можете обмежити довжину поля на рівні бази даних)


1
Я не розумію, чому ви хочете дозволити комусь вписати ім’я з 8000+ символів.
DForck42

2
Така ж логіка може бути застосована і до мов програмування. Чому б не повернутися до старого варіанту VB6 для всіх наших даних? Я не думаю, що наявність чеків і противаг у кількох місцях обов'язково погана.
Метт Спрадлі


10
Ваше оновлення має бути власною відповіддю на це питання.
Йоганн

відповідь-питання перенесена на належну відповідь, оскільки оригінальний автор цього не зробив. stackoverflow.com/a/35177895/10245 Я думаю, що на 7 років достатньо часу :-)
Тім Абелл

Відповіді:


153

Це ж питання було задано на форумах MSDN:

З початкової публікації (набагато більше інформації там):

Під час зберігання даних у стовпці VARCHAR (N) значення фізично зберігаються таким же чином. Але коли ви зберігаєте їх у стовпці VARCHAR (MAX), за екраном дані обробляються як значення TEXT. Отже, потрібна додаткова обробка, яка стосується значення VARCHAR (MAX). (лише якщо розмір перевищує 8000)

VARCHAR (MAX) або NVARCHAR (MAX) розглядається як "тип великого значення". Великі типи значень зазвичай зберігаються "поза рядом". Це означає, що рядок даних матиме вказівник на інше місце, де зберігається "велике значення" ...


2
Тож має бути питання, чи існує різниця між використанням N / VARCHAR (MAX) та N / TEXT?
Невикладене

18
Якщо я пригадую правильно, чи не зберігаються вони лише поза рядком, якщо розмір перевищує 8 к?
Сем Шютте

79
Відповідь я читаю як "ні, використання недоліків немає N/VARCHAR(MAX)", оскільки є додаткова обробка "лише в тому випадку, якщо розмір перевищує 8000". Таким чином, Ви несете витрати лише в разі необхідності , а Ваша база даних є менш обмежувальною . Чи читаю я це неправильно? Здається, ви б майже завжди хотіли, N/VARCHAR(MAX)а не N/VARCHAR(1-8000)...
Кент Богаарт

1
Мертве посилання вище - робочим посиланням на питання про MSDN є social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/…
Jagd

68
На жаль, ця відповідь має низку проблем. Це робить кордону 8k схожим на чарівне число, це неправда, значення витісняється з рядка на основі може бути більше факторів, включаючи sp_tableoptions: msdn.microsoft.com/en-us/library/ms173530.aspx . Типи VARCHAR (255) також можуть бути витіснені з рядка, згаданий 'накладний' може бути абсолютно однаковий для MAX і 255. Він порівнює типи MAX з типами TEXT, коли вони відрізняються, як це отримується (зовсім інший API для маніпулювання, різні сховища тощо). Тут не зазначаються фактичні відмінності: немає індексу, немає операцій в Інтернеті на типах MAX
Remus Rusanu

50

Справедливе питання, і він заявив, крім очевидних ...

До недоліків можна віднести:

Наслідки для продуктивності Оптимізатор запитів використовує розмір поля для визначення найбільш ефективного плану виконання

"1. Розподіл простору у розширеннях та сторінках бази даних є гнучким. Таким чином, додаючи інформацію в поле за допомогою оновлення, вашій базі даних доведеться створити покажчик, якщо нові дані довші за попередні вставлені. стати фрагментованим = нижча продуктивність майже у всьому, від індексу до видалення, оновлення та вставки. " http://sqlblogcasts.com/blogs/simons/archive/2006/02/28/Why-use-anything-but-varchar_2800_max_2900_.aspx

Наслідки інтеграції - іншим системам важко знати, як інтегруватись із вашою базою даних. Непередбачуваний ріст даних Можливі проблеми безпеки, наприклад, ви можете зламати систему, зайнявши весь дисковий простір

Тут є добра стаття: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1098157,00.html


4
+1 Для інтеграції та наслідків для безпеки. Це оригінальний кут, який слід враховувати, коли більшість інших відповідей говорять про ефективність. Що стосується інтеграційних наслідків, будь-які інструменти (наприклад, автори звітів або дизайнери форм), які використовують метадані для забезпечення розумних розмірів керування за замовчуванням, потребують набагато більше роботи, якби всі стовпці були varchar(max).
Розчарувались

Інтеграція по базі даних - це найсмішніше, що я знаю. Якщо це лише імпорт, зроблений один раз, ви можете перевірити дані перед функцією LEN.
Максим

30

На підставі посилання, що міститься у прийнятій відповіді, виявляється, що:

  1. 100 символів, які зберігаються в nvarchar(MAX)полі, зберігатимуться не більше ніж 100 символів у nvarchar(100)полі - дані зберігатимуться вбудованими, і ви не матимете накладних витрат на читання та запис даних "поза рядком". Тож ніяких турбот там немає.

  2. Якщо розмір перевищує 4000, дані зберігатимуться "поза рядком" автоматично, що саме ви хотіли б. Тож ніяких турбот теж немає.

Однак ...

  1. Не можна створити індекс у nvarchar(MAX)стовпці. Ви можете використовувати повнотекстову індексацію, але не можете створити індекс у стовпці, щоб покращити ефективність запитів. Для мене це ущільнює угоду ... є певним недоліком завжди використовувати nvarchar (MAX).

Висновок:

Якщо ви хочете отримати якусь "універсальну довжину рядка" у всій вашій базі даних, яку можна індексувати і яка не витрачає місця та час доступу, тоді ви можете використовувати nvarchar(4000).


1
fyi Це редакція, додана до оригінального запитання, яке повинно було бути розміщено як відповідь
Тім Абел

1
Дякую, для мене це остаточна відповідь. Я запитав себе те саме - чому б не використовувати nvarchar(max)весь час - як stringу C #? - але відповідь дає пункт 3) (питання індексу).
SQL Police

1
Додано редагування. Як своєрідну "універсальну довжину рядка" ви завжди можете використовуватиnvarchar(4000)
SQL Police

@SQLGeorge Подивіться на цю чудову відповідь Мартіна Сміта про вплив на ефективність запитів оголошень стовпців ширшими, ніж вони коли-небудь будуть
billinkc

@billinkc Спасибі, це чудова стаття. Гаразд, тому розмір дійсно впливає на перфромність. Я ще раз відредагую відповідь.
SQL Police

28

Іноді потрібно, щоб тип даних надавав певного сенсу даних, що містяться в ньому.

Скажімо, наприклад, у вас стовпець, який дійсно не повинен бути довше, скажімо, 20 символів. Якщо ви визначите цей стовпець як VARCHAR (MAX), якийсь ізловмисний додаток може вставити в нього довгу рядок, і ви ніколи не дізнаєтесь, або яким-небудь чином запобігти цьому.

Наступного разу, коли ваше додаток використовуватиме цей рядок, за умови, що довжина рядка скромна та розумна для домену, який вона представляє, ви відчуєте непередбачуваний та заплутаний результат.


9
Я погоджуюся з цим та деякими іншими коментарями, але я все ще стверджую, що це відповідальність бізнес рівня. До того моменту, коли вона досягне рівня рівня бази даних, вона повинна оснастити салют і зберегти значення, як би смішно це не було. Я думаю, що насправді тут грає те, що я думаю, що приблизно 90% часу, коли розробник вказує varchar (255), його намір насправді не 255 символів, а якесь невизначене значення середньої довжини. І враховуючи компроміс між необґрунтовано великими значеннями в моєму db та непередбаченими винятками, я візьму великі значення.
Кріс Б. Беренс

4
Якщо вони вказують VARCHAR (255), щоб вказати якусь невідому довжину, то це їхня вина, що вони не вивчили належним чином те, що вони розробляють. Рішення полягає в тому, щоб розробник робив свою роботу, а не база даних дозволяла нерозумні значення.
Том Х

10
не корисно автору. він явно виключив це питання, на яке ви дали відповідь.
usr

6
@ Кріс Б Беренс: Я не згоден; схема бази даних є частиною бізнес-логіки. Вибір таблиць, відносин, полів і типів даних - це вся бізнес-логіка - і для використання правил цієї бізнес-логіки варто використовувати RDBMS. З однієї причини дуже рідко буває, що до бази даних є лише один рівень програми; наприклад, у вас можуть бути інструменти імпорту та вилучення даних, які обходять основний рівень бізнесу, а це означає, що вам справді потрібна база даних для виконання цих правил.
Вінс Боудрен

1
Якщо вам не потрібні або дійсно хочете зберігати довгі рядки, тоді краще застосувати розуміння даних. Наприклад, якщо ви зберігаєте поле PostCode, ви дозволите комусь ввести сотні чи тисячі символів, коли це має бути максимум 10 скажемо.- Максимальний розмір повинен бути підтверджений на всіх рівнях, клієнті, бізнес-рівні та базі даних. Якщо ви використовуєте підхід Model First, наприклад, з C # та Entity Framework, ви можете визначити, що ви максимально збільшуєтесь у моделі, і застосувавши її до бази даних, бізнес-логіки та перевірки клієнта (з подобами перевірки jquery). Використовуйте nvarchar (max) лише в тому випадку, якщо цього дійсно потрібно
Пітер Керр

21

Я перевірив деякі статті та знайшов корисний тестовий сценарій із цього: http://www.sqlservercentral.com/Forums/Topic1480639-1292-1.aspx Потім змінив його на порівняння між NVARCHAR (10) проти NVARCHAR (4000) проти NVARCHAR (MAX ) і я не знаходжу різниці швидкостей при використанні вказаних чисел, але при використанні MAX. Ви можете протестувати самостійно. Сподіваюся, що це допоможе.

SET NOCOUNT ON;

--===== Test Variable Assignment 1,000,000 times using NVARCHAR(10)
DECLARE @SomeString NVARCHAR(10),
        @StartTime DATETIME;
--=====         
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='10', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(4000)
DECLARE @SomeString NVARCHAR(4000),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='4000', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(MAX)
DECLARE @SomeString NVARCHAR(MAX),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='MAX', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO

4
Це цікаво. На моїй коробці здається, що MAX у 4 рази повільніше.
stucampbell

4
Нові результати на SQL Server 2012: 10 вдвічі повільніше, ніж 4 к, а MAX у 5,5 разів повільніше, ніж 4 к.
Кассандрад

1
Більшість часу - це неявна передача від варчара до нварчара (макс.). Спробуйте це: DECLARE \ @SomeString NVARCHAR (MAX), \ @abc NVARCHAR (max) = N'ABC ', \ @StartTime DATETIME; SELECT @startTime = GETDATE (); ВИБІР ТОП 1000000 \ @SomeString = \ @abc ВІД master.sys.all_column ac1, master.sys.all_column ac2; SELECT testTime = 'MAX', тривалість = DATEDIFF (мс, \ @ StartTime, GETDATE ()); Довелося вставити \ перед змінними, щоб опублікувати його.
Квасі

4
SQL Server 2014 на SSD: 150, 156, 716 (10, 4000, MAX).
Максим

2
Дякуємо, що додали справжні цифри до цієї дискусії. Ми часто забуваємо, що побудова тестового випадку є найшвидшим способом розуміння.
Девід C

13

Подумайте про це як про ще один рівень безпеки. Ви можете створити свою таблицю без зовнішніх ключових зв’язків - цілком дійсних - і забезпечити існування асоційованих організацій повністю на рівні бізнесу. Однак закордонні ключі вважаються гарною дизайнерською практикою, оскільки вони додають іншого рівня обмежень у випадку, якщо щось зіпсується на рівні бізнесу. Те саме стосується обмеження розміру поля та не використання varchar MAX.


8

Причина НЕ використовувати максимум або текстові поля полягає в тому, що ви не можете виконувати інтерактивну перебудову індексу, тобто ЗАБУДОВА З ONLINE = ВКЛ навіть у програмі SQL Server Enterprise Edition.


1
Це ж обмеження діє для типу поля TEXT, тому вам слід використовувати VARCHAR (MAX) замість TEXT.
Буде Шейвер

через це ми не змогли відновити наш кластерний індекс. це коштувало нам багато дискового простору, поки ми не змогли витягнути стовпчик у свою власну таблицю (ми не могли дозволити собі заблокувати стіл більше 7 секунд)
Choco Smith

4

Єдиною проблемою, яку я виявив, було те, що ми розробляємо наші програми на SQL Server 2005, і, в одному випадку, ми повинні підтримувати SQL Server 2000. Я щойно дізнався, важкий спосіб, що SQL Server 2000 не любить опцію MAX для varchar або нварчар.


2
То чому б просто не розвиватися на найнижчому загальному знаменнику?
бінкі

4

Погана ідея, коли ви знаєте, що поле буде в заданому діапазоні, наприклад, від 5 до 10 символів. Я думаю, що використовував би макс, лише якщо не був би впевнений, якою буде довжина. Наприклад, номер телефону ніколи не буде перевищувати певну кількість символів.

Чи можете ви чесно сказати, що ви не впевнені у вимогах приблизної довжини для кожного поля вашої таблиці?

Я розумію, хоча є декілька полів, які я б, звичайно, міг би використати varchar (max).

Цікаво, що документи MSDN підсумовують це досить добре:

Використовуйте varchar, коли розміри записів даних стовпців значно відрізняються. Використовуйте varchar (max), коли розміри записів даних стовпців значно відрізняються, а розмір може перевищувати 8000 байт.

Тут є цікава дискусія з цього питання .


2
Для таких речей, як телефонні номери, я б набагато приємніше використовувати поле char замість varchar. Поки ви зберігаєте стандарт у своєму сховищі і вам не доведеться турбуватися про телефонні номери з різних країн, вам ніколи не знадобиться змінне поле для чогось типу номера телефону (10 без форматування) або поштового індексу (5 або 9-10, якщо додати останні чотири цифри) тощо.
TheTXI

Я мав на увазі телефонні номери, які можуть відрізнятися за довжиною. Можливо, я мав би поставити це у відповідь. Все, що має фіксовану довжину, я використав би поле char.
RichardOD

Або, можливо, я повинен сказати у своєму коментарі nchar або char. :-)
RichardOD

2
Кількість символів у телефонному номері - це майже вимога бізнесу. Якщо вам потрібно було зберегти міжнародний стандартний код разом з номером, він може бути більше 10. Або в якійсь частині світу може бути більше 10 цифр для номера телефону. Уявіть випадок переходу IPV4 до IPV6. Ніхто не заперечував би, що нам потрібно більше 12 цифр за старі добрі дні IPV4. Це може не мати користі, якщо IPV6 стане поширеним. Це знову-таки зміна бізнес-правил за певний період часу. Як сказано, зміни є єдиною постійною річчю, яку ми можемо очікувати :)
олівцем

2
Будьте уважні, припускаючи, що ви знаєте, скільки символів може бути в полі телефонного номера або якими символами вони будуть. Якщо система не використовує ці дані для фактичного набору номера (у цьому випадку ви повинні бути чіткими щодо форматів), користувач може законно поставити туди несподівано довгі рядки, наприклад, "0123 456 78910 запитати прийом для розширення 45, а потім передати Джеймсу".
Вінс Боудрен

4

Завдання бази даних - зберігати дані, щоб вони могли використовувати підприємство. Частина зробити ці дані корисними - це забезпечити їх значимість. Якщо дозволити комусь ввести необмежену кількість символів для свого імені, це не забезпечує значущих даних.

Побудова цих обмежень у бізнес-шарі є хорошою ідеєю, але це не гарантує, що база даних залишатиметься цілою. Єдиний спосіб гарантувати, що правила даних не будуть порушені - це застосувати їх на мінімально можливому рівні в базі даних.


6
IMO, обмеження тривалості даних ґрунтуються виключно на ділових правилах, які можуть змінюватися протягом певного часу, коли програма зростає. Зміна правил бізнесу за бізнес-логікою простіше, ніж на рівні db. Отже, я думаю, що db повинен бути досить гнучким і не повинен бути прив’язаний до таких правил бізнесу, як максимально дозволена довжина імені, що дуже залежить від того, в якому світі ви
живете,

3

Одна з проблем полягає в тому, що якщо вам доведеться працювати з декількома версіями SQL Server, MAX не завжди буде працювати. Тож якщо ви працюєте зі застарілою базою даних або будь-якою іншою ситуацією, яка включає декілька версій, краще будьте дуже обережні.


Я думаю, що невисловлене припущення з боку ОП полягає в тому, що він має справу повністю з прикладами 2005+ і що його додаткам не потрібно буде працювати на 2000 (або, вже, нижчих) версіях. Я повністю згоден з вами, якщо є необхідність підтримувати старіші версії, хоча!
Джон Руді

Джон Руді: Я думаю, що це так, я просто знаю, що сам наткнувся на ці перешкоди, коли не думав, що збираюся.
TheTXI

Насправді ця проблема є все ще актуальною проблемою із сучасними матеріалами завдяки SQL CE 4, який не підтримує типи стовпців MAX, тому сумісність - це клопоти.
JohnC

3

Як було зазначено вище, це насамперед компроміс між сховищем та продуктивністю. Принаймні, у більшості випадків.

Однак є принаймні ще один фактор, який слід враховувати при виборі n / varchar (Max) над n / varchar (n). Чи будуть індексуватися дані (наприклад, прізвище)? Оскільки визначення MAX вважається LOB, то все, що визначено як MAX, недоступне для індексації. і без індексу будь-який пошук, що включає дані як предикат у пункті WHERE, буде вимушений здійснити сканування повної таблиці, що є найгіршою ефективністю, яку ви можете отримати для пошуку даних.


2

1) Сервер SQL повинен буде використовувати більше ресурсів (виділена пам'ять та час процесора) при роботі з nvarchar (max) проти nvarchar (n), де n - число, характерне для цього поля.

2) Що це означає щодо продуктивності?

На SQL Server 2005 я запитав 13000 рядків даних із таблиці з 15 nvarchar (max) стовпцями. Я приурочував запити кілька разів, а потім змінював стовпці на nvarchar (255) або менше.

Запити до оптимізації були в середньому за 2.0885 секунд. Запити після зміни поверталися в середньому за 1,90 секунди. Це покращило 184 мілісекунд покращення базового запиту select *. Це 8,8% покращення.

3) Мої результати узгоджуються з кількома іншими статтями, які вказували на різницю в ефективності. Залежно від вашої бази даних та запиту, відсоток покращення може змінюватись. Якщо у вас не так багато одночасних користувачів або дуже багато записів, то різниця в продуктивності не буде проблемою для вас. Однак різниця в продуктивності збільшуватиметься із збільшенням кількості записів та одночасних користувачів.


1

У мене був udf, який набивав рядки і ставив вихід на varchar (max). Якщо це було використано безпосередньо замість того, щоб повернути відповідний розмір для відрегульованого стовпця, продуктивність була дуже низькою. В кінцевому підсумку я поставив udf довільної довжини з великою нотою замість того, щоб покладатися на всіх, хто викликає udf, щоб перекинути рядок на менший розмір.


1

підтримка застарілої системи. Якщо у вас є система, яка використовує дані, і очікується, що вона буде певної довжини, то база даних є хорошим місцем для забезпечення довжини. Це не ідеально, але застарілі системи колись не є ідеальними. = Р


1

Якщо всі дані в рядку (для всіх стовпців) ніколи розумно не матимуть 8000 або менше символів, тоді дизайн на рівні даних повинен це застосувати.

Двигун баз даних набагато ефективніше, утримуючи все від місця зберігання. Чим менше ви можете обмежити рядок, тим краще. Чим більше рядків можна набити на сторінці, тим краще. База даних просто працює краще, коли їй потрібно отримати доступ до меншої кількості сторінок.


1

Мої тести показали, що існують відмінності при виборі.

CREATE TABLE t4000 (a NVARCHAR(4000) NULL);

CREATE TABLE tmax (a NVARCHAR(MAX) NULL);

DECLARE @abc4 NVARCHAR(4000) = N'ABC';

INSERT INTO t4000
SELECT TOP 1000000 @abc4
    FROM
    master.sys.all_columns ac1,
    master.sys.all_columns ac2;

DECLARE @abc NVARCHAR(MAX) = N'ABC';

INSERT INTO tmax
SELECT TOP 1000000 @abc
    FROM
    master.sys.all_columns ac1,
    master.sys.all_columns ac2;

SET STATISTICS TIME ON;
SET STATISTICS IO ON;

SELECT * FROM dbo.t4000;
SELECT * FROM dbo.tmax;

0

Цікаве посилання: Навіщо використовувати VARCHAR, коли ви можете використовувати TEXT?

Йдеться про PostgreSQL та MySQL, тому аналіз продуктивності відрізняється, але логіка «чіткості» все-таки дотримується: навіщо змушувати себе завжди турбуватися про щось, що має значення невеликий відсоток часу? Якщо ви зберегли адресу електронної пошти до змінної, ви використовуєте "рядок", а не "рядок, обмежений 80 знаками".


1
Це схоже на те, що у вас не повинно бути обмежень перевірки, щоб вік людини не був від’ємним числом.
Джонатан Аллен

Я бачу різницю між правильністю даних та оптимізацією продуктивності.
Оріп

0

Основним недоліком, який я можу побачити, є те, що скажімо, у вас це є:

Який із них дає вам найбільше інформації про дані, необхідні для користувальницького інтерфейсу?

Це

            CREATE TABLE [dbo].[BusData](
                [ID] [int] IDENTITY(1,1) NOT NULL,
                [RecordId] [nvarchar](MAX) NULL,
                [CompanyName] [nvarchar](MAX) NOT NULL,
                [FirstName] [nvarchar](MAX) NOT NULL,
                [LastName] [nvarchar](MAX) NOT NULL,
                [ADDRESS] [nvarchar](MAX) NOT NULL,
                [CITY] [nvarchar](MAX) NOT NULL,
                [County] [nvarchar](MAX) NOT NULL,
                [STATE] [nvarchar](MAX) NOT NULL,
                [ZIP] [nvarchar](MAX) NOT NULL,
                [PHONE] [nvarchar](MAX) NOT NULL,
                [COUNTRY] [nvarchar](MAX) NOT NULL,
                [NPA] [nvarchar](MAX) NULL,
                [NXX] [nvarchar](MAX) NULL,
                [XXXX] [nvarchar](MAX) NULL,
                [CurrentRecord] [nvarchar](MAX) NULL,
                [TotalCount] [nvarchar](MAX) NULL,
                [Status] [int] NOT NULL,
                [ChangeDate] [datetime] NOT NULL
            ) ON [PRIMARY]

Або це?

            CREATE TABLE [dbo].[BusData](
                [ID] [int] IDENTITY(1,1) NOT NULL,
                [RecordId] [nvarchar](50) NULL,
                [CompanyName] [nvarchar](50) NOT NULL,
                [FirstName] [nvarchar](50) NOT NULL,
                [LastName] [nvarchar](50) NOT NULL,
                [ADDRESS] [nvarchar](50) NOT NULL,
                [CITY] [nvarchar](50) NOT NULL,
                [County] [nvarchar](50) NOT NULL,
                [STATE] [nvarchar](2) NOT NULL,
                [ZIP] [nvarchar](16) NOT NULL,
                [PHONE] [nvarchar](18) NOT NULL,
                [COUNTRY] [nvarchar](50) NOT NULL,
                [NPA] [nvarchar](3) NULL,
                [NXX] [nvarchar](3) NULL,
                [XXXX] [nvarchar](4) NULL,
                [CurrentRecord] [nvarchar](50) NULL,
                [TotalCount] [nvarchar](50) NULL,
                [Status] [int] NOT NULL,
                [ChangeDate] [datetime] NOT NULL
            ) ON [PRIMARY]

3
Я вважаю за краще бізнес-логіка, яка говорить мені, що назва компанії може містити не більше 50 символів, а не покладатися на таблицю бази даних для цієї інформації.
Хан

Я погоджуюся з Джеффом. Я не думаю, що магазин наполегливості є правильним місцем для визначення правил вашого бізнесу. А в багатошаровій архітектурі ваш інтерфейс навіть не знав би про стійкість шару.
stucampbell

Якщо, звичайно, ви не використовуєте значення, обмежене певним розміром, наприклад, код ISO для країни.
Бен

2
Що це стосується дефігу таблиці? Ви все ще можете мати логіку бізнесу. Я думаю, що ваша думка не має сенсу, пов’язана з тим, як створена таблиця. Якщо ви все ще хочете розробити якесь визначення у вашому бізнес-шарі, так і нехай буде. Хоча те, що було б більше сенсу, це використання збереженого протоколу в будь-якому випадку на бізнес-рівні; не таблиця def ??
carlos martini

1
Це здається непопулярним, але я погоджуюся з carlos, якщо db встановлює максимальний розмір, то ви можете бути комфортними у всіх шарах, які ви будуєте поверх нього, з чим ви, мабуть, матимете справу. Це особливо важливо, якщо у вашій базі даних є декілька систем.
Тім Абелл

0

Одним недоліком є ​​те, що ви будете проектувати навколо непередбачуваної змінної, і, ймовірно, будете ігнорувати, замість того, щоб скористатися внутрішньою структурою даних SQL Server, поступово складеною з рядків, сторінок (сторінок) та обсягу (s).

Що змушує мене думати про вирівнювання структури даних у C, а також те, що усвідомлення вирівнювання, як правило, вважається хорошою річчю (TM). Подібна ідея, інший контекст.

Сторінка MSDN для сторінок і розширень

Сторінка MSDN для даних про переповнення рядків


0

спершу я подумав про це, але потім знову подумав. Існують наслідки для продуктивності, але однаково вони служать формою документації, щоб мати уявлення про те, якого розміру поля насправді мають. І це застосовується, коли ця база даних знаходиться в більшій екосистемі. На мою думку, головне - бути вседозволеним, але тільки в межах розуму.

ок, ось мої почуття просто з питання логіки бізнесу та рівня даних. Це залежить від того, якщо ваша БД - це спільний ресурс між системами, які діляться діловою логікою, то, звичайно, це здається природним місцем для застосування такої логіки, але це не найкращий спосіб зробити це, найкращий спосіб - це надання API, це дозволяє взаємодія, яка підлягає тестуванню, зберігає ділову логіку там, де вона належить; вона тримає системи нерозв’язаними, вона зберігає ваші рівні в системі, деакульовані. Якщо, однак, ваша база даних обслуговує лише одну програму, то давайте дозволити AGILE подумати, що зараз правда? дизайн поки що. Якщо і коли потрібен такий доступ, надайте API до цих даних.

Очевидно, що це просто ідеал, якщо ви працюєте з існуючою системою, ймовірність полягає в тому, що вам потрібно буде зробити це по-різному, принаймні за короткий термін.


-1

Це спричинить проблеми з продуктивністю, хоча, якщо ваша база даних мало, вона може ніколи не викликати фактичних проблем. Кожен запис займе більше місця на жорсткому диску, і в базі даних потрібно буде прочитати більше секторів диска, якщо ви шукаєте відразу багато записів. Наприклад, невеликий запис може вміщувати 50 у сектор, а великий - 5. Потрібно прочитати 10 разів більше даних з диска, використовуючи великий запис.


5
-1. Рядок довжиною 100, що зберігається у nvarchar(max)стовпці, займає не більше місця на диску, ніж якби він був у nvarchar(100)стовпці.
Мартін Сміт

Те, що ви описуєте, є правильним, якщо розмір збережених даних більший, але це питання стосується того, чи має тип даних наслідки для продуктивності чи інші міркування.

-2

Це ускладнить дизайн екрана, оскільки ви більше не зможете передбачити, наскільки широкими повинні бути ваші елементи управління.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.