现在我有一个带有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,但我觉得它不值得,因为我可能永远不会在注释信息中搜索任何内容将通过视频显示。
可能这是很常见的问题,但我不知道如何搜索类似的问题,所以很高兴听到任何提示。
答案 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的视频(除非另有说明,否则会如何区分?),视频上的唯一键约束会在您的数据模型中反映出来。