Вопрос

Это дизайн сомнений в том, что у меня есть коллекция из 1500 изображений, которые должны отображаться на странице ASP.NET, изображения отображаются отличаются от одной страницы к другому, подсчет этих изображений увеличится в то время приходить,

а.).

б.).

У нас есть в частности, какая-либо стратегия дизайна в традиционной базе данных для получения изображений с наименьшим временем поездки, существует любое решение, отличное от использования традиционной базы данных?

Редактировать 1:Каждое изображение заменяется его новой записью каждые 12 часов, поэтому их на базе данных, возможно, не очень хорошая идея, что я могу подумать, но как лучше будет использовать хранилище данных и индексировать эти изображения?

Редактировать 2:Да, мы планируем запускать приложение на кластере. И если мы попытаемся использовать хранилище данных (если это хороший вариант), то он совместим с C # & ASP.net?

PS: Я использую SQL Server для хранения этих изображений.

Это было полезно?

Решение

Все предыдущие комментарии действительно хорошие ... При отсутствии очень конкретных требований мы должны сделать широкие обобщения для иллюстрации ваших вариантов. Вот несколько примеров.

  • Если Сырая скорость Это то, что вам нужно, то плоские файлы - четкий победитель. Будь то использование Apache или IIS, они оба оптимизированы, чтобы очень быстро служить статическим содержимым на основе файлов. Высокопроизводительные сайты все знают это и будут хранить большую часть своего содержания с учетом динамического обращения, но затем «публикуют» выбирать куски их динамического контента; в статических версиях; на их веб-ферму на периодической или военной основе. Хотя это требует немного оркестровки, это можно сделать дешево и действительно может снизить нагрузку на ваш сервер базы данных, Backeng Network и т. Д. В качестве простого примера публикуется в папку с корнем этой структуры, которая динамически оценивается. Когда вы готовы публиковать обновления, напишите новую папку, а затем измените корневой путь. Нет времени вниз, дешево, и легко. В соответствующем примечании потяните всю эту информацию из магазина Backeng, потребуют, чтобы вы загрузили эти вещи в память. Это в конечном итоге в конечном итоге переведет к большему количеству времени в сборке

  • Если тебе нужно мелкозернистый контроль По о том, как изображения организованы / выставлены, то папки могут быть не наиболее подходящими. Если например, вам нужно организовать изображения отдельных пользователей, и вам нужно отслеживать много метаданных вокруг изображений, а затем база данных может быть хорошей подходящей. С этим сказанным, ваша команда базы данных, вероятно, будет ненавидеть вас за это, потому что это представляет ряд проблем от перспективы управления базами данных. Кроме того, если вы используете ORM, у вас могут возникнуть проблемы с тем, чтобы сделать эту работу, и может обнаружить, что ваш след памяти растет до неприемлемых уровней из-за скрытых прокси-объектов, кэширования второго уровня и т. Д. Это все может быть смягчено, поэтому просто остерегайтесь Убедитесь, что профиль вашего приложения. С этим сказанным, структурированный магазин (например, DB) является более идеальным для этого случая использования.

  • Учитывая безопасность... В зависимости от того, что представляют эти изображения, плоские файлы неизбежно приводят к опасениям к атакам канонизации, перечисление грубых рублей структур папок BROWSBASE, повторных файлов cookie, URL, ViewState и т. Д. Если вы используете пользовательские роли или претензии Модель безопасности, которую вы можете найти, используя плоские файлы, становятся несколько болезненными, поскольку вам придется отображать ограничения безопасности файловых систем к логическим / контекстным ограничениям безопасности. Такие проблемы часто приводят ко мне, чтобы предпочтение структурированному магазину.

Знаю вышеупомянутого кэша - это хорошая и может помочь создать некоторую среднюю почву относительно того, как часто вы на самом деле попадаете в вашу базу данных, хотя она не поможет с проблемами, связанными с потреблением памяти, GC, и т. Д., Вы можете использовать встроенные В кэшировании механизмов кэширования, хотя кэш / сетку, которая поддерживает хранилище для подложки, было бы намного лучше, если вы можете себе это позволить (Ex. Ncache, масштабирование и т. Д.). Они обеспечивают хорошую масштабируемость / резервность, а также можно использовать для разгрузки хранения состояния сеанса, ViewState и намного больше.

Надеюсь это поможет.

Другие советы

У вас в основном есть 2 варианта

1) Храните двоичный в базе данных. Varbinary (Max) поле будет хорошим выбором DataType. 2) Храните путь к изображению, хранящему на диске в базе данных. Nvarchar (Max) будет хорошим выбором для DataType.

Есть конечно Pro's и Con обоих решений. Не зная больше о ваших требованиях, его трудно посоветовать, что является лучшим способом.

Я предпочитаю не хранить изображения в базе данных - вместо этого просто хранить ссылку (путь / имя файла / идентификатора и т. Д.) К правильному изображению.

Затем, если вы реализуете HTTPhandler, чтобы обслуживать изображения, вы можете хранить их в любом другом месте. Вот очень базовая реализация:

public class myPhototHandler: IHttpHandler
{    

    public bool IsReusable {
        get { return true; }
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {

            if (Context.User.Identity.IsAuthenticated) {
                var filename = context.Request.QueryString("f") ?? String.Empty;
                string completePath = context.Server.MapPath(string.Format("~/App_Data/Photos/{0}", filename));
                context.Response.ContentType = "image/jpeg";
                context.Response.WriteFile(completePath);             
            }

    }

}

Для отличного ресурса при настройке обработчика проверить этот блог пост и другие смежные посты.

Я бы не преодолел ваше решение. Недостатком для хранения изображений в базе данных является база данных Bloat и требования к хранению для резервных копий, особенно если изображения хороши для 12 часов. Если сомневаюсь, держите его простым, поэтому, когда требования меняются, вы не вложили так много времени в любом случае.

Вот как я сделал это на моем сайте.

  • Храните изображения в папке.
  • Если вы хотите контролировать имя файла, пользователь видит или использует условному логику, используйте HTTPhandler для обслуживания изображения, в противном случае просто используйте его полный путь и имя файла в теге IMG.
  • Если вы говорите с высоким объемом мега-сайта, возможно, рассмотрите возможность использования сети доставки контента.

Считаете ли вы кэшировать ваши образы, чтобы смягчить время турнира в SQL Server? Кэширование может быть уместно в браузере (через HTTP заголовки) и / или HTTP-обработчик, обслуживающий изображение (через System.Web.caching.).

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

Использование SQL Server также означает, что у вас будут удобные параметры для контроля параллелизма, разделения и репликации, если они соответствуют вашему приложению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top