【问题标题】:Database for image tagging图像标记数据库
【发布时间】:2015-05-23 06:10:36
【问题描述】:

我需要为一个学校项目设计一个图像标记数据库。

该站点将包含图像、标签和用户。 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;

我想随着我添加更多功能,情况只会变得更糟。

我在想也许我需要想出一种设计,将图像的当前标签和标签的历史拆分成单独的实体。这是一个好的方向还是有其他方法可以做到这一点?我猜这一定是一个已解决的问题。

【问题讨论】:

    标签: c# database-design linq-to-entities


    【解决方案1】:

    我会拆分它。最终用户不会根据图片在 3 周前的标签来搜索图片,而是根据它当前的标签来搜索图片。我会选择这样的东西:

    创建表格图像 ( id int 主键, 标题 varchar(255) 不为空, 文件位置 varchar(255) 不为空 ); 创建表格标签 ( id int 主键, 标题 varchar(255) 不为空 ); 创建表 images_tags ( image_id int 不为空, tag_id int 不为空, 主键(image_id,tag_id) ); 创建表 images_tags_log ( image_id int 不为空, tag_id int 不为空, created_by varchar(255) 不为空, date_create 日期时间不为空, 删除_by varchar(255), date_delete datetime null, 主键(image_id、tag_id、date_create) );

    这样可以轻松提取图像当前具有的标签,但如果您想了解更多信息,可以查看image_tags_log 表。

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2019-07-05
      • 2012-10-01
      相关资源
      最近更新 更多