Почему мне нужно установить максимальную длину каждого текстового столбца в базе данных?

StackOverflow https://stackoverflow.com/questions/2865795

  •  30-09-2019
  •  | 
  •  

Вопрос

Почему каждый RDBMS настаивает на том, что вы рассказываете о том, что будет то, что будет иметь максимальную длину текстового поля ... Почему он не может просто сделать вывод, эта информация образует данные, которые помещают в базу данных?

Я в основном работал с MS SQL Server, но каждая другая база данных, которую я знаю, также требует, чтобы вы установили эти произвольные пределы в вашей схеме данных. Реальность состоит в том, что это не особенно полезно или дружелюбна, чтобы работать с, потому что это изменяет бизнес-требования все время, и почти каждый день некоторые конечные пользователи пытаются поставить много текста в эту колонку.

Кто-нибудь с некоторыми внутренними рабочими знаниями RDBMS знает, почему мы просто не вывод о лимитах от данных, которые вставляют в хранение? Я не говорю о догадывании информации о типе, но угадать пределы определенного текстового столбца.

Я имею в виду, есть причина, по которой я не использую nvarchar (max) на каждом текстовом столбце в базе данных.

Это было полезно?

Решение

Поскольку компьютеры (и базы данных) глупы. Компьютеры не очень хорошо угадают и, если вы не скажете им, они не могут сказать, что столбец будет использоваться для телефона или копии войны и мира. Очевидно, что БД может быть спроектирован так, чтобы каждый столбец мог содержать бесконечное количество данных - или, по меньшей мере, настолько, когда позволяет дисковое пространство - но это было бы очень неэффективным дизайном. Чтобы получить эффективность, то мы делаем компромисс и заставить дизайнер сообщить базу данных, насколько мы ожидаем поставить в колонку. Предположительно, может быть значение по умолчанию, чтобы если вы не укажете один, он просто использует его. К сожалению, любые по умолчанию, вероятно, не подходят для подавляющего большинства людей из перспективы эффективности.

Другие советы

Это связано со скоростью. Если указан максимальный размер строки, вы можете оптимизировать способ сохранения информации для быстрее ввода / вывода. Когда скорость является ключевым, последнее, что вы хотите, является внезапным перетасованием всех ваших данных, только потому, что вы изменили состояние состояния на полное имя.

С помощью Max Size Set База данных может выделить максимальное пространство для каждой сущности в этой колонке и независимо от изменений в стоимости отсутствия адресной площади не должно меняться.

Эта почта не только отвечает на ваш вопрос о том, использовать ли использовать nvarchar(max) Везде, но это также дает некоторое представление о том, почему базы данных исторически не позволяли этому.

Это как сказать, почему мы не можем просто сообщить базу данных, которую мы хотим таблицу и позвольте ему сделать вывод, какой тип и сколько столбцов нам нужно от данных, которые мы его даем.

Проще говоря, мы знаем лучше, чем база данных. Предполагается, что у вас есть один из миллионов шансов положить в базу данных в базу данных 2000 символов, в большую часть времени это 100 символов. База данных, вероятно, взорвется или откажется от строки символов 2K. Он просто не может знать, что вам нужно понадобиться 2К, если в течение первых трех лет вы ввели только 100 длинных строк.

Кроме того, длина символов используется для оптимизации размещения строк, чтобы строки могли быть прочитаны / пропущены быстрее.

Я думаю, что это потому, что RDBMS использует случайный доступ к данным. Для выполнения случаев доступа к данным они должны знать, какой адрес на жестком диске они должны впрыскивать, чтобы быстро прочитать данные. Если каждая строка одной колонны имеет разные длины данных, они не могут сделать вывод, каковы начальная точка адреса, которую они должны прыгать напрямую, чтобы получить его. Единственный способ - это загрузка всех данных и проверять его.

Если RDBMS изменит длину данных столбца на фиксированное число (например, максимальная длина всех строк) каждый раз, когда вы добавляете, обновляете и удалите. Это чрезвычайно много времени

На что бы база БД на это догадка? Если бизнес-требования регулярно меняются, он будет так же удивлен, как вы. Если есть причина, по которой вы не используете nvarchar (max), вероятно, причина, по которой это тоже не по умолчанию ...

Проверьте этот протектор http://www.sqlservercentral.com/forums/topic295948-146-1.aspx.

Ради примера, я собираюсь наступить в Quicksand и предложить, что вы сравните его с приложениями, выделенными памятью (RAM). Почему программисты не спрашивают / выделяют всю память, им нужно, когда запускается программа? Потому что часто они не знают, сколько им понадобится. Это может привести к приложениям, захватывающим все больше и больше памяти, поскольку они бегают, и, возможно, также освобождают память. И у вас есть несколько приложений, работающих одновременно, а новые приложения, начинающиеся и старые приложения. И приложения всегда хотят смежных блоков памяти, они плохо работают (если вообще), если их память разбросана по всему адресному пространству. Со временем это приводит к фрагментированной памяти, и все эти проблемы сбора мусора, которые люди разрывают свои волосы на протяжении десятилетий.

Перейти к базам данных. Хотите, чтобы это произошло с вашими жесткими дисками? (Помните, производительность жесткого диска очень, очень Медленно по сравнению с операциями памяти ...)

Похоже, что ваше деловое правило: введите столько информации, сколько вы хотите в любом текстовом поле, так что вы не злитесь на DBA.

Вы не разрешаете пользователям вводить 5000 символьных адресов, поскольку они не будут помещаться на конверте.

Вот почему у Twitter есть текстовый предел и спасает всех неприятностей чтения через кучу бессмысленной древесины, которая просто продолжается и никогда, и никогда не попадает в точку, но только удается бегать читателя, заставляя их удивляться, почему у вас такое разорение для их Время, выбирая эгоцентрированный и бесчеловечный образ жизни, ориентированные на содействие актам копирования и вставки столько данных, сколько боги буферов памяти позволит ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top