Хорошо ли хранить длинные строки в базе данных? - PullRequest
9 голосов
/ 17 сентября 2009

Мне нужно хранить длинные строки в базе данных. строка может состоять из 5 или 6 предложений. Как вы думаете, это хорошая стратегия дизайна. или я должен сохранить идентификатор для этой строки и затем создать связь с другой таблицей, которая содержит местоположение файла, хранящего строку. Не могли бы вы дать преимущества и недостатки обоих.

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

Ответы [ 8 ]

11 голосов
/ 17 сентября 2009

Хорошо, если строка хранится в базе данных. Если вместо этого вы храните указатель файла, это означает, что вам нужно выполнять File I / O каждый раз, когда вы хотите прочитать строку. Несколько предложений не очень длинны, и вы всегда можете использовать поле данных длинного текста, если вам нужно. Очевидно, ваша база данных будет немного больше, потому что у вас есть текст, но это нормально. Это, безусловно, лучшая альтернатива, чем хранение файлов.

8 голосов
/ 17 сентября 2009

Строки, которые вы упоминаете, совсем не длинные.

Когда вы ссылались на "длинные" строки, я думал о 32 КБ и выше - некоторые предложения <1 КБ - сегодня это ничего. </p>

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

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

4 голосов
/ 17 сентября 2009

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

3 голосов
/ 17 сентября 2009

Пять или шесть предложений - ничто для современной СУБД! Сохраните текст непосредственно в базе данных.

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

2 голосов
/ 17 сентября 2009

Сама база данных не имеет реальной проблемы с хранением длинных строк. Существуют некоторые ограничения (например, ограничение размера записи 8k на SQL Server), но даже в этом случае вы можете хранить текст произвольной длины в базе данных, поскольку все необходимые поддерживают типы данных BLOB / TEXT практически без верхнего предела.

Пять-шесть предложений не очень длинные. Если они принадлежат друг другу и предназначены для извлечения и манипулирования ими в целом, вы можете пойти дальше и сохранить их в поле типа данных CHAR соответствующих размеров.

Вопрос о том, следует ли разделить их и прикрепить к ним идентификатор, возникает только в том случае, если ваше приложение / модель данных получает непосредственную выгоду от этого подхода, т. Е. На самом деле это разные вещи. В вашем случае, похоже, нет причин идти по этому пути.

2 голосов
/ 17 сентября 2009

Ответ действительно зависит от объема строк, которые вы намереваетесь хранить, и от того, какую БД вы намереваетесь использовать для хранения. Если вы не храните много строк, возможно, вы захотите сохранить их в XML-файле или файле ресурсов и загрузить их в свое приложение заранее. Однако, если у вас много строковых данных, вам, вероятно, будет лучше по памяти читать строку по мере необходимости, а не использовать возможность чтения строки в память, которую вы в конечном итоге не используете.

1 голос
/ 17 сентября 2009

Все упоминали о производительности, но никто не говорил о другой важной причине, по которой хранение указателей на файлы ОС является плохой идеей: резервное копирование и восстановление. Если все находится в базе данных, то у нас есть единый механизм резервного копирования данных и единый механизм восстановления. Принимая во внимание, что с файлами в ОС у нас есть два разных механизма резервного копирования, возможно, с двумя разными гранулярностями, и восстановление становится кошмаром синхронизации.

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

0 голосов
/ 17 сентября 2009

За исключением особых случаев, я бы оставил поле там, где оно есть.

Единственным другим вариантом было бы поместить строки в другую таблицу (поместив туда реальные строки) ... размещение их в отдельных файлах снизит производительность.

...