簡體   English   中英

如何在兩個表mysql之間建立關系

[英]How to create relationship between two tables 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. topicId作為更新和刪除級聯的主題中topicId的外鍵關系
  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上添加唯一索引。

關於鏈接表方案,如果你真的有這樣的話,我會使用它:

  • 您的架構設計似乎是明確單向的,其中主題有注釋,注釋只有一個擁有主題。 所以這將是一個邏輯上的缺陷。
  • 如果您要查看評論並加入主題,則需要額外的加入,這可能會降低性能
  • 使用JPA獲取評論主題會有點尷尬,因為您將獲得一個主題列表,然后您需要顯式獲取第一個條目。
  • 您最終會在“主題”表中找到過時/冗余的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM