Текстовое поле sql против плоского файла против хранилища документов nosql
Я планирую иметь таблицу фактов SQL, включающую текстовое поле, которое я не собираюсь индексировать (я буду только считывать данные и очень редко обновлять их). Я думаю, что эта таблица может стать довольно большой, в первую очередь из-за этого текстового поля. Остальные данные в моей базе данных имеют смысл быть реляционными, однако я считаю, что я мог бы гораздо проще и дешевле масштабировать, если бы вместо этого я сохранял указатели на плоские файлы (где каждый указатель на отдельный текстовый файл хранится в чем-то вроде S3) вместо использования текстового поля.
Альтернатива, которая, кажется, набирает популярность, - это полностью основанное на документах решение NoSQL (например, CouchDB, MongoDB и т. Д.). Мне интересно, каковы компромиссы (масштабируемость / надежность / безопасность / производительность / простота внедрения / простота обслуживания / стоимость)) между простым использованием текстового поля SQL, указателем на плоские файлы или полным переосмыслением всей системы в контексте хранилища документов NoSQL?
1 ответ
Наилучшим подходом является использование реляционной базы данных для обычных (нетекстовых) данных и сохранение больших (текстовых) данных "где-то еще", которые могут обрабатывать большие данные лучше, чем реляционная база данных.
Во-первых, давайте обсудим, почему плохая идея сохранять большие данные в реляционной базе данных:'
- размеры строк становятся намного длиннее, поэтому ввод / вывод требуется для чтения на страницах диска с выносками целевых строк
- Размеры резервных копий и, что более важно, время резервного копирования увеличивается до такой степени, что они могут нанести вред задачам DBA и даже привести системы в автономный режим (затем резервные копии отключаются, затем происходит сбой диска, упс)
- вам обычно не нужно искать текст, поэтому нет необходимости иметь его в базе данных
- реляционные базы данных и библиотеки / драйверы, как правило, плохо справляются с необычно большими данными, а способ обработки часто зависит от поставщика, что делает любое решение непереносимым
Ваш выбор "где-то еще" широк, но включает в себя:
- программное обеспечение для хранения больших данных, такое как Cassandra, MongoDB и т. д.
- Базы данных NoSQL, такие как Lucene
- Файловая система
Делайте то, что проще всего - это работает - все они действительны, пока вы выполняете расчеты ваших требований для:
- пиковая производительность записи
- пиковая производительность чтения
- объем длительного хранения
Еще один совет: не храните ничего о тексте в реляционной базе данных. Вместо этого назовите / индексируйте текст, используя идентификатор строки реляционной базы данных. Таким образом, если вы измените свою реализацию, вам не нужно перенастраивать свою модель данных.