Что лучше?Запрос файловой системы или запрос базы данных? - PullRequest
3 голосов
/ 23 марта 2012

У нас в файловой системе около полумиллиона изображений. Несколько изображений принадлежат продукту и названы в честь ProductID. Например, код продукта 10010 имеет 3 изображения; 10010_1.jpg, 10010_2.jpg и 10010_3.jpg. Чтобы отобразить эти 3 изображения в фотогалерее, текущий код в классическом ASP запрашивает файловую систему. Код выглядит примерно так:

Dim objFSO, i
Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 
i=1
While objFSO.FileExists(Server.MapPath(productid & "_" & i & ".jpg")
    ' draw the image
    i = i + 1
WEnd

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

Мой стол будет выглядеть примерно так:

ID      ProductID   ImageURL
-------------------------------------------
1       10010       10010_1.jpg
2       10010       10010_2.jpg
3       10010       10010_3.jpg
4       10011       10011_1.jpg
. . .

Есть предложения? Я переписываю веб-сайт в ASP .NET MVC 3. Что-нибудь еще нужно позаботиться в этой платформе / Framework?

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

ИМО, вы можете реализовать одно из двух решений.

  1. Гибридный - использовать базу данных для сохранения пути к файлу в том виде, в каком он существует в файловой системе.

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

Я видел обе используемые реализации,# 1 до появления # 2 стал популярным.Несмотря на то, что я использовал № 1 дольше, я чувствую, что № 2 - лучшая альтернатива для хранения данных «актива» (изображения, описания html, видеофайлы).Основная причина того, что NoSQL лучше, чем MySQL, в отношении доступа к данным активов, заключается в том, что вы не тратите драгоценные соединения с базой данных только для того, чтобы получить пути к файлам.

Также еще одна рекомендация;разделите ваши каталоги, используя productids в качестве родительских каталогов.Примите во внимание следующее:

# yours
dir1
  ... 125K files
dir2
  ... 125K files

# chunked (parent dirs are product ids)
3
  ... 3 files
4 
  ... 2 files
5 
  ... 3 files

Статистические файлы в каталоге, где их всего несколько (<100 файлов), гораздо быстрее, чем статовые файлы в каталоге, в котором несколько тысяч файлов. </p>

0 голосов
/ 23 марта 2012

Есть о чем подумать.Я предполагаю, что это стек .NET, поэтому:

  1. Пространство базы данных стоит дорого
  2. Чтение с диска будет быстрее, чем чтение из реляционной базы данных
  3. Вы будетебольше проблем в среде с балансировкой нагрузки, если все ваши изображения находятся в базе данных
  4. Чтение большого количества данных из базы данных негативно повлияет на другие запросы
  5. Не имеет значения, является ли вашаУровень представления - это MVC, веб-формы или консольное приложение.Ваша проблема в дизайне базы данных.
0 голосов
/ 23 марта 2012

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

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

Поскольку вопрос производительности связан с вопросом - прототип и мера для вашего набора данных, если производительность вызывает сомнения.Что нужно учитывать при создании прототипа / измерения:

  • , для этого вам не нужно создавать сайт, для запуска достаточно простого консольного приложения, которое считывает данные с диска / базы данных.
  • попробуйте разные макеты файлов (т. Е. Хранение большого количества файлов в одном каталоге может замедлить поиск файлов)
  • убедитесь, что вы знаете, будут ли данные кэшироваться.Если ваша база данных слишком велика, поэтому она не может быть кэширована, вы получите совершенно другие числа по сравнению со случаем, когда она помещается в память.Не забывайте, что в зависимости от конфигурации сервера некоторые другие сервисы могут конкурировать и за ту же память.
0 голосов
/ 23 марта 2012

Полмиллиона записей в базе данных не так уж и велики.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...