用于视频注释的数据库设计,其中注释没有唯一ID

时间:2015-05-08 01:05:04

标签: database-design

现在我有一个带有2个类的java程序:

public class Video {                                                              
    private String id;                      
    private List<Annotation> annotations;   
    ...
}

public class Annotation{                                                              
    private String id;    
    ...                 
}

因此每个视频可以有很多注释,注释只能在1个视频中显示。它应该是一个(视频)到多个(注释)关系,但问题是:注释在所有视频中没有唯一的ID。像这样:

Video id=1:
Annotation id=1; 
Annotation id=2; 

Video id=2:
Annotation id=1; 
Annotation id=2; 

我无法更改注释id生成,因为我从不同的服务器获取它们并且它们应该保持不变。

那么在sql中存储它的最佳方法是什么?现在我可以看到唯一的解决方案是将注释存储为视频表中的xml字符串。还有一个选项:在Annotation中创建某种新的ID,它将连接Video .id和Annotation.id,但我觉得它不值得,因为我可能永远不会在注释信息中搜索任何内容将通过视频显示。

可能这是很常见的问题,但我不知道如何搜索类似的问题,所以很高兴听到任何提示。

1 个答案:

答案 0 :(得分:1)

仅仅因为输入数据中的某个内容被称为“id”并不意味着您可以(或应该)将其用作主键。您可以使用所谓的自然键获取数据。由于您不控制它们,并且您不想依赖于您无法控制的内容,因此您应该生成自己的密钥(代理密钥)并在数据库内部使用它们。

所以我会选择(比如说你使用MySQL)

create table videos (
    video_id int(10) auto_increment primary key,
    external_id int(10) unique key
);


create table video_annotations (
    annotation_id int(10) auto_increment primary key,
    video_id int(10),
    external_id int(10),
    constraint video_id_fk foreign key (video_id) references videos(video_id)
);

据推测,源系统不会提供带有重复ID的视频(除非另有说明,否则会如何区分?),视频上的唯一键约束会在您的数据模型中反映出来。