2015-05-22 3 views
0

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

Сайт будет иметь Изображения, Теги и пользователи. Evey Image получает теги с одним или несколькими тегами (такие вещи как: лето, пляж, Tyoko и т. Д.), Но мне также нужно отслеживать историю добавления и удаления тегов.

Решение, которое я придумал было иметь таблицу TagHistory так:

public class TagHistory 
{ 
    public virtual int TagHistoryId { get; set; } 
    public virtual DateTime Date { get; set; } 
    public virtual User TaggedBy{ get; set; } 
    public virtual Image Image { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

Так текущие метки на изображении было бы просто изображения последняя запись TagHistory.

Это вызывает проблемы, однако, для поиска, потому что только последние записи в TagHistory подсчитывают, что мне сначала нужно получить все текущие TagHistories для каждого изображения и , затем заготовьте фильтрацию. Это то, что я придумал для поиска всех изображений, содержащих конкретный тег:

var curTagHis = from tagHistory in ctx.TagHistories 
       group tagHistory by tagHistory.Image 
       into groups 
       select groups.OrderByDescending(th => th.Date).FirstOrDefault(); 

var images = from tagHistory in curTagHis 
      where tagHistory.Tags.Any(t => t.TagID == tag.TagID) 
      select tagHistory.Image; 

И я полагаю, что это будет только хуже, как я добавляю больше возможностей.

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

ответ

0

Я бы разделил его. Конечный пользователь не будет искать изображения, основываясь на том, какие теги у него были 3 недели назад, но какие теги у него есть. Я бы с чем-то вроде этого:

 
create table images 
(
    id int primary key, 
    title varchar(255) not null, 
    file_location varchar(255) not null 
); 

create table tags 
(
    id int primary key, 
    title varchar(255) not null 
); 

create table images_tags 
(
    image_id int not null, 
    tag_id int not null, 
    primary key (image_id, tag_id) 
); 

create table images_tags_log 
(
    image_id int not null, 
    tag_id int not null, 
    created_by varchar(255) not null, 
    date_create datetime not null, 
    deleted_by varchar(255), 
    date_delete datetime null, 
    primary key (image_id, tag_id, date_create) 
); 

Что это дает для этого достаточно просто потянуть то, что теги изображение имеет в настоящее время, но если вы хотите получить больше информации вы можете посмотреть в image_tags_log таблицу.

Смежные вопросы