#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) я бы посоветовал только путь к файлам хранить в БД, а файл дергать из файловой системы
Комментариев нет:
Отправить комментарий