Хранение информации



Хранение Файлов в Базе Данных

Хранение файлов в базе vs хранение в файловой системе  Апрель 14, 2015 – 10:27
Как хранить файлы в базе данных или во внешнем каталоге

В SqlServer вы можете использовать следующие варианты (некоторые из них применимы и к другим СУБД).

Вариант 1

В БД хранится "заголовок" файла (например, путь к файлу плюс, возможно, какой-то набор атрибутов):

create table [TableName] ( ... FilePath nvarchar(4000) not NULL... )

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

Вариант 2

В БД хранится также и содержимое файла (в столбце типа varbinary(max)).

create table [TableName] ( ... FileData varbinary(max) FILESTREAM not NULL, -либо -FileData varbinary(max) not NULL... )

Здесь две опции - с FILESTREAM и без.

Без FILESTREAM:

  • данные хранятся в БД (в т.н. LOB pages)
  • размер данных одного элемента ограничен 2Gb

С FILESTREAM:

  • данные хранятся в файловой системе (именно как файлы)
  • нет ограничения в 2Gb на элемент
  • данные FILESTREAM не участвуют при подсчёте лимита на макс. размер БД (к чему чувствительны Express Edition)
  • к данным можно получить доступ через соотв. API со стороны файловой системы
  • (SqlServer 2014 и далее) запрашиваемые данные не отъедают из buffer pool, оставляя больше памяти для обработки запросов

И с FILESTREAM и без поддерживаются транзакции. С FILESTREAM при доступе через Transact-SQL поддержка полная, при доступе через файловую систему есть ограничения (смотреть здесь).

Вариант 3

create table [FileTableName] as filetable

Их функционал основан на использовании FILESTREAM. Таблица представляет иерархию хранящихся файлов/директорий, их данные и атрибуты. В варианте 2, чтобы создать/удалить файл, нужно создать/удалить соотв. запись в таблице. В данном варианте это можно делать напрямую через файловую систему. Например зайти в соответствующую директорию (SqlServer создаёт для этого соответствующую UNC share), создать какой-то файл/директорию, удалить/изменить, потом сделать запрос select * from FileTableName и увидеть соответствующие изменения. И наоборот - при вставке записи в таблицу через SQL в директории появится соответствующий файл или директория.

Source: ru.stackoverflow.com


javakube.ru курс по разработке под kubernetes

Похожие публикации:

  1. Хранение и Передача Данных
  2. Хранение Времени в Базе Данных
  3. Хранение Паролей в Базе Данных