如何创建两个表mysql之间的关系



我有两个表:

主题表:

CREATE TABLE `topics` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`topicId` varchar(45) NOT NULL,
`title` text NOT NULL,
`details` text,
`dayPosted` varchar(45) DEFAULT NULL,
`username` varchar(45) DEFAULT NULL,
`userImage` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;

注释表:

CREATE TABLE `comments` (
`commentId` int(11) NOT NULL,
`topicId` varchar(45) NOT NULL,
`comments` text,
`commentDate` varchar(45) DEFAULT NULL,
PRIMARY KEY (`commentId`),
KEY `topicId_idx` (`topicId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

topicId列在这两个表中都是常见的,我想在两个表之间创建关系。问题是topicId不是主键(不过我可以让它独一无二)

或者,我应该创建第三个表,如topics_comments,并同时拥有两个表:

  1. 主题ID作为外键与主题ID的关系级联更新和删除
  2. commentId作为与的commentId的外键关系级联更新和删除

实际情况是,我有一个博客发布网站,用户将在该博客上发表评论,其中每个博客主题都有一个topicId,每个用户评论都有commentId,现在我必须根据条件创建表:

  1. 每个博客主题都可以有多条评论
  2. 删除博客主题时,该博客主题上的所有评论都必须被删除
  3. 发布评论的用户稍后可以删除或编辑评论

我正在使用mysql和spring-bootspring-jpa

实体类别:

@Entity
@Table(name = "topics")
public class TopicBean implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "topicId")
private String topicId;
@Column(name = "title")
private String title;
@Column(name = "details")
private String details;
@Column(name = "username")
private String username;
@Column(name = "userImage")
private String userImage;
@Column(name = "dayPosted")
private String dayPosted;
//Getters and setters
}

您可以坚持当前的模式,并且仍然能够使用JPA定义工作映射。以下是在当地环境中为我工作的设置(这里只有重要的部分):

主题

@Entity
@Table(name = "topics")
public class Topic implements Serializable {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "topicId")
private Integer topicId;
@OneToMany(mappedBy = "topic", cascade = {CascadeType.REMOVE, CascadeType.MERGE})
private List<Comment> comments;

评论

@Entity
@Table(name = "comments")
public class Comment implements Serializable{
@Id
@Column(name = "commentId")
private Integer commentId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "topicId", referencedColumnName = "topicId")
private Topic topic;

只需记住在TOPICS.topicsId.上添加唯一索引

关于链接表场景,如果你真的有:,我会使用它

  • 您的模式设计似乎是明确的单向的,Topics有注释,而注释只有一个拥有的主题。所以这将是一种逻辑缺陷
  • 如果您要从评论中查询并加入主题,则需要额外的加入,这可能会降低性能
  • 使用JPA获取评论的主题会有点尴尬,因为您将获得一个主题列表,然后您需要明确地获得第一个条目
  • 您最终会在Topics表中使用过时/多余的topicId列

好处当然是您可以正确加入,也就是使用主键,所以决定权在您。以下是映射:

主题

@Entity
@Table(name = "topics")
public class Topic implements Serializable {
@Id
@Column(name = "id")
private Integer id;
@ManyToMany
@JoinTable(name="COMMON",
joinColumns=@JoinColumn(name="TOPIC_ID"),
inverseJoinColumns=@JoinColumn(name="COMMENT_ID"))
private List<Comment> comments;

评论

@Entity
@Table(name = "comments")
public class Comment implements Serializable{
@Id
@Column(name = "commentId")
private Integer commentId;
@ManyToMany
@JoinTable(name="COMMON",
joinColumns=@JoinColumn(name="COMMENT_ID"),
inverseJoinColumns=@JoinColumn(name="TOPIC_ID"))
private Topic topic;

相关内容

  • 没有找到相关文章

最新更新