Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Где лучше хранить двоичные данные: в БД или отдельном файле? [ASP.NET MVC 3]

#c_sharp #net #sql_server #aspnet_mvc

                    
Доброго времени суток.
Есть база данных в которой хранятся учётные записи пользователей. К каждому пользователю
привязаны два двоичных файла. Первый файл занимает около 30КБ, второй занимает около
300КБ. Со временем количество пользователей может исчисляться сотнями тысяч.
Первый вариант - хранить эти данные в базе данных. Поле Data в таблице будет иметь
тип varbinary(MAX):
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    return File(world.Data, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    world.Data = new byte[worldData.ContentLength];
    worldData.InputStream.Read(world.Data, 0, worldData.ContentLength);
}

Второй вариант - хранить эти данные в виде отдельных файлов:
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    return File(pathToWorldData, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    worldData.SaveAs(pathToWorldData);
}

Есть ещё другой вариант - varbinary(MAX) и FILESTREAM, но чем он по сути отличается
от второго? Только будет много возни в коде.    


Ответы

Ответ 1



Если хранить данные как поле таблицы, база будет пухнуть. Использование опции FILESTREAM позволяет хранить данные как отдельные файлы, но при этом с поддержкой транзакционности. Правда, лог базы данных всё равно будет пухнуть, его надо будет чистить периодически. Теперь о проблемах. FILESTREAM работает только с Windows-аутентификацией при обращении к БД. Возможно, я чего-то не нашёл, но по-другому у меня не получилось. В сочетании с тем, что диспетчер служб Windows любит терять пароли после пары перезагрузок, работать с этой опцией становится совсем весело. Ещё у меня была такая фигня, что после установки какого-то из обновлений Windows её было не включить. С учётом того, что Microsoft любят добавлять всё время новые возможности своих продуктов, не доводя до ума старые, используйте лучше файлы. Если так надо сделать поддержку транзакционности, посмотрите в сторону распределённых транзакций.

Ответ 2



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

Ответ 3



ну если есть деньги, то в БД, т.к. 500 мегабайт стандартно вроде, дальше уже доп $$$ а также из базы дольше дергаться будет, факт поле надо выбирать не varchar точно, раз ты байты будешь там хранить, лучше уж varbinary (кстати, для xml файлов есть тип xml в 2008) я бы посоветовал только путь к файлам хранить в БД, а файл дергать из файловой системы

Комментариев нет:

Отправить комментарий