지금 제가 있는 사이트가 외래키를 안씁니다.
이유는 여러가지를 말하지만 어쨋든 안씁니다.
그래서 생각해보았는데요...
여러 고수님들의 의견을 들려주시기를....
- 외래키가 없이 데이타 무결성을 유지하고자 합니다.
- 시나리오는 단순히 A,B 두개의 테이블만 있고 B가 A를 참조합니다.
1) A에 입력할 때 : 그냥 입력하면 된다.
2) B에 입력할 때 : (1) B가 A를 참조하는 자료가 있다면 해당 값의 변경 삭제를 막기위해 A 테이블에 LOCK을 확보한다.
=> 오라클의 경우는 A 테이블의 자료를 Select For Update로 확보한다.
=> 그냥 Select 해서 값이 있는지 확인하는 것은 안된다. 이렇게 하면 동시성 사용자에 의해 A가 삭제될 수 있다.
(2) B 를 입력한다.
(3) Commit 하고 Lock을 해제한다.
3) B를 삭제할 때 : 그냥 삭제한다.
4) A를 삭제할 때 : (1) 삭제할 A 테이블의 자료에 대한 LOCK을 확보한 다음 B 테이블을 조회하여 참조하는 자료가 있는지 확인한다. 만약 있으면 삭제는 실패이다.
(2) 참조하는 자료가 없으면 A를 삭제한다.
=> 이때 현재의 나의 짧은 소견으로는 하위테이블에 대한 LOCK을 확보할 필요가 없어보인다.
왜냐면 B를 입력할 때 B가 A에대한 LOCK을 확보하므로 만약 A 삭제전에 B를 조회한 후 자료가 없는 것을 확인한 다음
삭제하기 직전에 B에 자료가 입력될 가능성은 없기 때문이다.
대략 생각하여도 아주 복잡하다.
그리고 이게 완벽하다는 보장도 없다.
그리고 어플리케이션을 작성할 때 행하나 지우자고 매번 이짓을 해야 한다.
다중 사용자 상황에서 릴레이션이 없으면 무결성을 지키기 위해 최소한 이만큼을 해야 한다.
그런데...
나한테 물어 보았다.
지금 릴레이션 없이 코딩하는 사이트에 와 있는데...
개발자의 양심을 걸고...
정말 저렇게 해야 하는데....
저렇게 했는가?????
절대 저렇게 안했다.
나 뿐 아니고 저렇게 한다는 사람을 본적이 없다.
그런데....
내가 들은 얘기는 자기 경험상 외래키 없이 개발한 사이트가 반반은 된단다....
그러면 도대체 그 반은 어떻게 무결성을 확보했을까?????
아!!! 잊은 것이 있어서...
저건 오라클의 경우이구요...
저런 LCOK은 벤더별로 다른 방법을 사용합니다.
가장 무식한 것은 테이블 통째로 LOCK 거는 겁니다.
저런 로직을 구현하면서 벤더 독립적으로 코딩해야 한다면 머리에 쥐나지 않을까요....
|