내 "태그"엔터티간에 관계를 만들고 싶습니다. 관계는 양방향이며, 나의 실체 "TagRelation"에 저장됩니다 관계의 방향이 아무 의미가 없기 때문에JPA - 고유 한 양방향 엔터티 관계
각 태그의 관계에만 tag_relations 테이블의 한 항목이 있어야합니다. 예를 들어 나는 삽입하는 경우 :
"숲"(태그 1) < -> "나무"(태그 2)
내가 관계를 다른 방법으로 주위 삽입 할 수 안 :
을 " - 트리 "(태그 1) <>"숲 "(태그 2)
이 테이블 tag_relation의 SQL 코드입니다 :
CREATE TABLE IF NOT EXISTS `tag_relation` (
id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`tag_id_1` INT(10) UNSIGNED NOT NULL ,
`tag_id_2` INT(10) UNSIGNED NOT NULL ,
`type` ENUM('related_subject','synonymous','alternative_writing') NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_tag_1` (`tag_id_1` ASC) ,
INDEX `fk_tag_2` (`tag_id_2` ASC) ,
UNIQUE INDEX `ux_relation_1_2` (`tag_id_1` ASC, `tag_id_2` ASC) ,
UNIQUE INDEX `ux_relation_2_1` (`tag_id_2` ASC, `tag_id_1` ASC) ,
CONSTRAINT `fk_tag_1`
FOREIGN KEY (`tag_id_1`)
REFERENCES `mm`.`tag` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tag_2`
FOREIGN KEY (`tag_id_2`)
REFERENCES `mm`.`tag` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 1
고유 색인으로 그들이 지금은 내가 원하는 독특한 관계를 시행하지 않습니다. 내 데이터베이스에서이를 어떻게 적용 할 수 있습니까?
저는 전문가가 아니므로 더 나은 해결책이 될 수 있습니다. 그러나 [tag1, tag2]가 [tag2, tag1]과 같다고 생각하면 첫 번째 열에 가장 낮은 ID가 삽입되고 두 번째 열에는 가장 큰 ID가 삽입되는 규칙을 적용 할 수 있습니다. 이것은 단순한 점검 제약에 의해 제한 될 수있다. –
방아쇠를 당기시겠습니까? 해결책은 좋게 들린다. 그 방아쇠를 쓰는 법을 찾아야 해. – BigJ
TagRelation 엔티티가 이미 tag_1 및 tag_2 참조를 설정했기 때문에 작동하지 않는다고 생각합니다. 당신이 제안한 방아쇠는 DB에 삽입 될 때 주위를 돌릴 수있어서 TagRelation 개체와 데이터베이스 사이의 불일치를 초래합니다. 하지만 아마도 데이터베이스에 고유 한 관계가 있는지 확인하는 트리거를 만들 수 있습니다. – BigJ