Организация базы данных изображений

#asp.net-mvc #database #database-design #entity-framework-4.1 #ef-code-first

#asp.net-mvc #База данных #база данных-дизайн #entity-framework-4.1 #ef-code-first

Вопрос:

Мне любопытно, как я должен организовать хранение изображений в моем приложении. Они будут храниться где-нибудь на диске с путем / URL, сохраненным в базе данных, но мое приложение стало сложным, и организация изображений ставит меня в тупик. Технология, которую я использую, является ASP.NET Сначала код MVC 3 EF 4.1 (что оказывается затруднительным из-за сложных взаимосвязей).

Это приложение на основе семейства, поэтому есть таблица семейства, таблица членов и таблица FamilyMember, с которыми можно связать две. Существует также FamilyEvent и таблица MemberEvent для отслеживания событий в жизни семьи или члена.

Варианты использования

Участник может загружать несколько изображений профиля (возможно, для размещения в альбоме «профиль»?)

Участник может загружать «семейные» фотографии, которые будут прикреплены к семейному объекту и помещены в какой-либо семейный альбом.

Участник может добавить событие member и прикрепить несколько изображений к событию members.

Участник может добавить семейное событие и прикрепить несколько изображений к семейному событию.

Это базовые варианты использования.

Мои мысли

Базовая таблица «Изображение» с идентификатором, описанием и, возможно, идентификатором пользователя загрузчика.

Таблица MemberProfilePicture с идентификатором, PictureID, MemberID и т.д…

Таблица MemberEventPicture с идентификатором, PictureID, [идентификатор участника?], membereventid и т.д…

Таблица FamilyEventPicture с идентификатором, PictureID, [FamilyID ?], familyeventid и т.д…

Это позволило бы семье или члену по существу «связать» изображение позже с другой фотографией профиля / событием участника / или семейным событием.

Мой вопрос

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

Ответ №1:

Сначала вы используете EF-код, поэтому давайте поговорим о коде, а не о таблицах. Вы можете реализовать свои варианты использования, имея только один класс Picture и связывая множество изображений с участником, семейством и так далее.

Берем этот код

 public class Family
{
    public int Id { get; set; }
    public virtual ICollection<Picture> Pictures { get; set; }
    public virtual ICollection<Member> Members { get; set; }
}

public class Member
{
    public int Id { get; set; }
    public virtual ICollection<Picture> Pictures { get; set; }
}

public class Picture
{
    public int Id { get; set; }
    public String Location { get; set; }
}
  

Сгенерирует 3 таблицы, семейства, члены, изображения, причем таблица Pictures будет иметь два внешних ключа Family_Id и Member_Id. Эта модель позволяет связать одно изображение с членом, семьей или обоими.

С точки зрения масштабируемости я бы не стал хранить двоичный файл изображения в базе данных и использовать ORM для доступа к двоичному файлу. Лучшие идеи — хранить изображение в файловой системе или на «специализированном» сервере, таком как MongoDBs GridFS.

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

1. Но не ограничивает ли привязка изображения к определенному участнику и / или семейству мое решение? Кроме того, почему в таблице изображений должно быть FK для Member и Family, разве это не ограничило бы меня одним изображением для каждого?

2. Вы можете связать изображение с семьей или членом или с обоими, чтобы это не ограничивало ваше решение.

Ответ №2:

Что бы я хотел сделать, так это иметь три таблицы.

Таблица ‘picture’, в которой хранится уникальный идентификатор для каждого изображения и местоположения. Таблица «профиль», в которой содержатся ваши сведения о профиле. Третья «связующая» таблица, состоящая из PictureID и ProfileID

Если я хочу связать изображение A с профилем X, я просто добавляю «A, X» в таблицу ссылок. То же самое для событий или чего-то еще. Если предполагается взаимосвязь «многие ко многим», это самый простой способ (я предполагаю, что одно и то же изображение может быть в нескольких профилях).

Надеюсь, я правильно понял вашу проблему.

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

1. Итак, по сути, то, что я предложил, — это правильный путь. Таблица изображений, таблицы ProfilePicture, MemberPicture, FamilyEventPicture и т.д…

2. Вам не нужно более одной таблицы XXXXXPicture . Вы можете поместить своего рода ‘enum’, если вам нужен один компоновщик.

3. Что вы имеете в виду? Вы говорите, что я могу связать изображение A с профилем X с помощью таблицы ссылок (скажем, ProfilePicture). Разве это не было бы то же самое, скажем, для события? Таблица ссылок для событий и изображений (EventPicture)?