sinho0689
118
2017-03-14 04:27:20
3
1189

외래키의 constraint-cascade의 정확한 의미가 뭘까요??(테이블 구조 첨부)


안녕하세요 db를 설계중인데, 외래키의 constraint를 어떻게 주어야 될지 몰라서 질문드립니다 ㅠㅠ


개략적인 프로젝트 설명을 드리면, map서비스/위치기반 다국어 포스팅 페이지를 개발중입니다.


일단 해당 테이블 설명을 드리겠습니당(mysqlworkbench로 작업중입니다)

icl_translation(번역정보) : 각 언어별 원본-번역글 관계를 정의합니다.


coordinate(좌표정보) : translation.group_id기준으로 글에서 사용된 좌표정보를 가지고 있습니다

(좌표정보의 경우, 번역과는 상관없기 때문에 group_id별로 하나씩만 가지고 있습니다.)


address(주소정보) : 위치기반 게시글이기 때문에, 검색이나 주소표시의 경우도 다국어로 표시해줘야 될 것 같아서 언어별(ex> ko, en, zh-cn, jp)로 주소를 표시할 수 있도록 제작하였습니다

 

번역정보.ID의 경우에는 주소정보.translation_id가 참조하고 있구요

번역정보.group_id의 경우는 좌표정보.translation_group_id와 주소정보.translation_group_id가

참조하고 있습니다.


번역정보.ID와 주소정보.translation_id의 경우는 1:1대응이라 update, delete 모두 CASCADE를 주면 될 것 같아서 별 문제는 없을 것 같습니다.


문제는 번역정보.group_id입니다. 이게 뭐하는거냐면

"the ID of the translation group, 즉 원본게시물-번역게시물들을 엮어주는 컬럼입니다."

ex> icl_translation.ID : 2(ko), 3(en), 4(jp), 5(ch)일 경우

=> 해당 데이터들의 번역정보.group_id=2(원본 게시물의 ID를 group_id의 값으로 설정한다.)로 설정됩니다.


제가 여기서 궁금한건....

만약에 주소정보.translation_group_id(group_id를 참조하고 있음)에

delete:CASCADE 속성을 적용 할 경우

1. 번역정보(icl_translation)중 해당 group_id를 가진 정보가 삭제되었다면 CASCADE 설정이 된

모든 주소정보(address)가 삭제되는건가요?

(ex> 한국어 글정보 삭제시 해당 group_id를 가지고 있는 모든 "주소정보"가 삭제됨)


2. 아니면 해당 group_id가 번역정보에 존재하지 않을경우 CASCADE 속성이 발동되는건가요?

(ex> 원본-번역 글정보 모두가 삭제되었을 경우 해당 group_id를 가지고 있는 모든 "주소정보"가 삭제됨)


  • ON UPDATE CASCADE : 기준 테이블의 데이터가 변경되었을 때 외래 키 테이블도 자동으로 변경
  • ON DELETE CASCADE : 기준 테이블의 데이터가 삭제되었을 때 외래 키 테이블의 데이터들도 자동으로 삭제
  • 제가 알고 있는 내용이고, 인터넷에서도 이렇게 돌고 있더라구요 ㅠㅠ


현재 개발상황에 비유해서 글이 길긴 한데.. 결론을 정리하자면

1번 개념이 맞을까요?, 2번개념이 맞을까요?

이런거 나중에 놓쳤다가 버그 터지면 짜증날거 같거든요 ㅠㅠ..

이거 아니어도 생길 버그가 많아서요 ㅠㅠ


도움 주시면 감사하겠습니다 ㅠㅠ

0
0
  • 답변 3

  •  (づ。◕ ܫ ◕。)づ
    5k
    2017-03-14 08:29:08

    궁금한게 있는데 그룹 아이디가 전부 삭제되지 않는 이상 참조된 테이블의 정보까지 삭제되지 않지 않나요?

    참조되는 테이블(번역)의 특정 그룹 아이디의 데이터가 전부 삭제되면 참조하는 테이블(주소)이 참조할 데이터가 존재하지 않기 때문에 cascade on delete 조건에 의해 같이 삭제되는게 아닌가요


    1
  • sinho0689
    118
    2017-03-15 02:14:13 작성 2017-03-15 02:17:42 수정됨

    고맙습니다~~~ 저도 질문하기 이전에는 KDEV님 같은 의견이 아닐까 생각했거든요.....

    그럼 SET NULL이나 NO ACTION으로 설정 후, trigger나 로직상에서 구현해야겠네요!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.