database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 34698 게시물 읽기
No. 34698
다중사용자 상황에서 외래키 없이 참조 무결성을 유지하기
작성자
김흥수(protokhs)
작성일
2008-11-06 14:40ⓒ
2008-11-06 14:44ⓜ
조회수
2,667

지금 제가 있는 사이트가 외래키를 안씁니다.

이유는 여러가지를 말하지만 어쨋든 안씁니다.


그래서 생각해보았는데요...

여러 고수님들의 의견을 들려주시기를....


- 외래키가 없이 데이타 무결성을 유지하고자 합니다.

- 시나리오는 단순히 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 거는 겁니다.

저런 로직을 구현하면서 벤더 독립적으로 코딩해야 한다면 머리에 쥐나지 않을까요....

이 글에 대한 댓글이 총 1건 있습니다.

- 프로그램에 A에 대한 삭제로직을 구현하지 않는다(필요하다면 상태관리).

- B에 입력할 때는 A에서 코드를 조회하도록 강제한다(Key in 등의 임의등록 불인정).


아마 위와 같이 하지 않나 싶습니다. 저도 그렇게 하구요.

뭐, 잘했단 얘긴 아닙니다. 무결성을 책임질 수 있단 얘기는 더더욱 아니구요.

에효...ㅜ0-)y~

지나가다..님이 2008-11-06 16:56에 작성한 댓글입니다.
이 댓글은 2008-11-06 16:57에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
34702opensuse 11에 oracle 9i 설치좀 도와주세요ㅠ.ㅠ
lincle
2008-11-07
1851
34700drsys 스페이스가 full 됬는데 [1]
mis
2008-11-06
1864
34699쿼리를 최적화 하고 싶어여.. 조언 부탁드려여 [2]
오혜진
2008-11-06
2537
34698다중사용자 상황에서 외래키 없이 참조 무결성을 유지하기 [1]
김흥수
2008-11-06
2667
34697다중insert 문의
옹달샘
2008-11-06
2735
34696DB 초보 질문 드려요. 바쁘지 않으시면 한번 봐주세요 ^^ [1]
김세영
2008-11-06
2742
34695오라클 세션을 체크할때 ora-03114 이외에 더 체크해야 할값이 있을까요? [1]
오라초보
2008-11-06
3564
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다