图像标注数据库
Database for image tagging
我需要为学校项目设计图像标注数据库。
网站将有图片、标签和用户。每个图像都被标记了一个或多个标签(标签是这样的:summer、beach、Tyoko 等),但我还需要跟踪谁添加和删除了哪些标签的历史记录。
我想出的解决方案是有一个像这样的 TagHistory table:
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 条目才算数我首先必须为每个图像获取所有当前的 TagHistory,然后然后 执行过滤。这是我想出的搜索包含特定标签的所有图像的方法:
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;
我想随着我添加更多功能,情况只会变得更糟。
我在想,也许我需要想出一种设计,将图像的当前标签和标签的历史拆分成单独的实体。这是一个好的方向,还是有其他方法可以做到这一点?我猜这一定是一个已经解决的问题。
我会分开。最终用户不会根据图片 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
table.
我需要为学校项目设计图像标注数据库。
网站将有图片、标签和用户。每个图像都被标记了一个或多个标签(标签是这样的:summer、beach、Tyoko 等),但我还需要跟踪谁添加和删除了哪些标签的历史记录。
我想出的解决方案是有一个像这样的 TagHistory table:
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 条目才算数我首先必须为每个图像获取所有当前的 TagHistory,然后然后 执行过滤。这是我想出的搜索包含特定标签的所有图像的方法:
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;
我想随着我添加更多功能,情况只会变得更糟。
我在想,也许我需要想出一种设计,将图像的当前标签和标签的历史拆分成单独的实体。这是一个好的方向,还是有其他方法可以做到这一点?我猜这一定是一个已经解决的问题。
我会分开。最终用户不会根据图片 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
table.