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
운영게시판
최근게시물
자유게시판 자유게시판 5486 게시물 읽기
 
No. 5486
PK 사용하면 추세에 뒤떨어지는건지...
작성자
박용운(refill)
작성일
2006-12-06 15:50
조회수
8,473


"왜 제가 만든 SQL에 있던 PK 날렸죠?"


"요즘 누가 PK를 써요? 시대에 뒤떨어진..... "



'이런... 시xxxx'


무조건 추세 쫓아 다녀야하나..  에휴..

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

요즘 그 시XXXXX 는 머 쓴답니까? 궁금하네요...

석이님이 2006-12-06 15:53에 작성한 댓글입니다. Edit

저도 궁금;

신기배(소타)님이 2006-12-06 16:01에 작성한 댓글입니다.

-- "요즘 누가 PK를 써요? 시대에 뒤떨어진....."

이렇게 정신이 지구에 없는 분들이 간혹 있죠.
지구인으로 살라니까 힘든거예요.
초보대왕님이 2006-12-06 16:09에 작성한 댓글입니다. Edit

pk 가 프라이머리 키 였죠? 전 의례적으로 pk 쓰는데..

pk 안쓰는 사람이 오히려 바보 아닌가요?

이상호(search5)님이 2006-12-06 17:29에 작성한 댓글입니다.

안쓰면 안되는 거죠

말그대로 RDBMS인데

그걸 안쓰면 뭘 쓴다는 거죠?



대부분 귀찮아서 그러는 거지


꼭 써야 데이타가 유용한 데이타가 되는거죠~~~


힘네세요~

지연님이 2006-12-06 17:53에 작성한 댓글입니다. Edit

PK 를 안쓴다...

게으름의 증거겠죠.
그럼 RDBMS 가 아니겠죠.

사실 constraint 를 걸어 준다는 것은 나중에 프로그래밍을 하던지 DB remodeling 을 할때 참 많이 걸립니다.
하지만 무결성을 위해서는 될 수 있으면 정확히 필요한 만큼 constraint 를 걸어줘야 합니다.

당연한게 아닌가 생각합니다.

그분께 제대로 된 DB modeling 한것 좀 보여 달라고 하세요.

어떻게 하셨는지...

실제로 궁금해 집니다 ^^

정재익(advance)님이 2006-12-06 18:46에 작성한 댓글입니다.

흠...PK 하니깐 Player Kill 이 생각나네...-.ㅡ;;;;;

team b(teamb)님이 2006-12-06 19:20에 작성한 댓글입니다.

 요즘 추세가 pk없는건가요.처음듣네..

우린 pk없는거 찾아내서 억지로 다 걸어주기까지 했는데..물론 다른 이유때문이긴 하지만..
여튼 대!략!난!감! OTL

여기 엔코아도 오고 엠에스도 있고.. 씨퀄하면 이바닥에서 알아주는 사람들도 왔다리 갔다리 한곳인데... pk다 만들어져있습니다. 디비설계에서 추세라는걸 따지는것도 우습지만.. 그분기준의 추세도 아닌듯합니다.

지나다가님이 2006-12-07 11:19에 작성한 댓글입니다. Edit

요즘 추세로 따지자면...

 

개념없는게 유행이죠? 안드로메다 관광 ㅋㅋㅋ

신기배(소타)님이 2006-12-07 14:07에 작성한 댓글입니다.
이 댓글은 2006-12-07 14:08에 마지막으로 수정되었습니다.

그 뒤에 추가된 말이.. 더 좌절입니다.

"DB도 모르시는 분 같은데... " 

".... "


'아.. 그래 모른다 몰라.. -_-;'

결국 그쪽에서 하자는대로 하고 있습니다. 뭐.. '갑'이 하자면 해야죠. ( -_-)

박용운(refill)님이 2006-12-07 14:38에 작성한 댓글입니다.

엑셀로 착각하는거 아닙니까? ㅋㅋㅋ

신기배(소타)님이 2006-12-07 15:28에 작성한 댓글입니다.
이 댓글은 2006-12-07 16:22에 마지막으로 수정되었습니다.

그분께 이글의 URL을 살포시 던저 주세요..


물론 님께서 보여주기 전의 사전 세팅하신뒤 보여주셔야겠지만,


갑이 하자는대로 하다가는~~  평생~~ 똥개 훈련 받을겝니다.


갑의 요구를 무시해서도 안되시만..


 가장 좋은것은 시방서(없는건 아니죠?) 대로 해주면됩니다.


 그이후 유지보수 할때 역시  유지계약서에 의거한대로만 해주시면 됩니다.



 만일 DATA 무결성의 원칙에 의거 갑이 일방적으로 db를 훼손 할 경우

 그에 대한 면책 특권 조항을 계약서에 명시하세요

(아마, 기본적으로 무결성원칙은 계약서에 첨부되는걸로 압니다)


 대 놓고 법대로 하자고 우기면... 프로젝트가 없어질찌도 ... ㄷㄷㄷ

이창민(Prosper)님이 2006-12-07 19:36에 작성한 댓글입니다.
게시판을 통해서도 이 부분에 대해서 몇번 언급 드린 내용인데...



PK는 물리적으로는 unique index + not null 제약조건으로 이루어집니다.


PK를 지정하면 자동으로 위와 같이 구성이 되죠. 

일반적으로 PK을 걸지 않는다는 것은 unique index + not null 을 직접 지정하여 사용하겠다는 뜻입니다.


RDB에서는 반드시 유일하게 식별할 수 있는 키로써 PK를 요구하고 있습니다.
물론 PK 대신에 unique index + not null  를 지정하여도 실재로는 동일하다고 생각할 수도 있습니다.


그러나... 여러가지 문제점이 발생합니다.

실수로 not null을 지정하지 않고 unique index만 지정할 경우 데이터 무결성이 깨지거나 성능 문제를 일으킬 수 있습니다. 칼럼이 nullable이면 인덱스를 타지 않게 됩니다.(비록 null값이 없어도 옵티마이져는 없다는걸 알지 못하므로...)


PK 제약조건은 말그대로 제약조건입니다. 오라클의 데이터딕셔너리에 저장되는 정보일 뿐이고 그 자체로 성능에 영향을 주지 않습니다.  
(오라클의 경우 딕셔너리 sys.cdef$  에 저장되는 정보입니다.)

그런데 PK를 지정하면 느리다고 주장해서 unique index + not null로 지정하는 경우도 있는데 ... 근거를 한번 제시해보라고 해보세요.


또 하나는 DBA들이 운영 관점에서 불편하다고 하여 PK를 꺼리는 경우도 있습니다.
alter table emp add constraint emp_pk primary key(empno) 등으로 처리할 경우 empno에 uk index 와 not null 이 자동으로 발생합니다.
그런데 이 경우 uk index를 nologging  parallel 처리등을 하기가 불편하니까. (enable, disable등을 할 경우 불편하니까.)   
사실 미리 create index emp_pk on emp on (empno) nologging parallel 8; 커맨드로 uk index를 생성해놓고...  alter table emp add constraint emp_pk primary key(empno) using index
해도 되지만 DBA들이 귀찮아하는 경우도 있습니다. (명령어 하나 더 쳐주기가 귀찮다라는거죠.)



저는 실수를 방지하기 위해 PK를 반드시 지정할 것을 권장합니다.  아울러 저는 FK도 참조 무결성이 중요하다면 반드시 지정할 것을 권장합니다. 
DB는 데이터규칙을 담는 그릇입니다 원래 그러한 목적으로 태어난 놈입니다. 
성능 때문이라고 주장하시는 분들께 구체적인 자료를 요구해보시기 바랍니다.
저는 실재로 부하를 측정해보았으나 미미했습니다.  참조 무결성이나 유일성 제약조건이 수행하는 Data에 대한 정합성 기능이 성능 문제를 일으키기 때문에 사용 못 하겠다는것은 참 아이러니 한 일입니다.


이 문제와 관련된 문제로

데이터에 대한 입력값 제약조건은 APP에서 하는 경우도 있고 , DB에서 하는 경우도 있을 수 있습니다.  반드시 DB에서 다 검증할 수는 없는게 분명합니다. 어떤 경우는 APP에서 검증하는게 더 좋을 수도 있습니다.
예를 들어 입력값 뒤에 붙는 스페이스 문자들의 Trim ...   
이 부분도 정책을 잘 수립해서 가야합니다.

어떤 사이트의 경우  날짜형을 varchar2로 선언해서 사용하고 있었는데,  APP에서... 날짜가 잘못 들어온 케이스가 있었습니다.  예를 들어 2006-11-33 같이 존재할 수 없는 값이 들어왔습니다.
쿼리에서는 to_date 등의 연산을 처리했으나... 11-33은 존재하지 않으므로 해당 SQL에서는 오류가 발생하였습니다. 결국 해당 업무는 서비스 불가.
따라서 제약조건 아주 중요하고 전략적으로 가져가야 합니다.
김주현님이 2006-12-08 11:18에 작성한 댓글입니다.
이 댓글은 2006-12-08 11:25에 마지막으로 수정되었습니다. Edit

이야~~ -_-)=b

신기배(소타)님이 2006-12-08 12:05에 작성한 댓글입니다.

김주현님의 말씀에 100%동감합니다...


귀찮다고 그냥 그렇게 쓰다가 위의 경우와 비슷한 경우가 많이 생기죠~~~ㅋㅋ

지연님이 2006-12-08 15:34에 작성한 댓글입니다. Edit

-- 이 문제와 관련된 문제로

-- 데이터에 대한 입력값 제약조건은 APP에서 하는 경우도 있고 ,
-- DB에서 하는 경우도 있을 수 있습니다.
-- 반드시 DB에서 다 검증할 수는 없는게 분명합니다.
-- 어떤 경우는 APP에서 검증하는게 더 좋을 수도 있습니다.
-- 예를 들어 입력값 뒤에 붙는 스페이스 문자들의 Trim ...   
-- 이 부분도 정책을 잘 수립해서 가야합니다.

좋은 글 감사힙니다
그런데 이 부분에서는 다른 의견을 갖고 있읍니다.

입력값 제한 조건은 가능하면 "DB, App 양쪽에서 체크하는 것이 좋다"  라는 것입니다.
입력값의 앞 뒤에 space 가 붙는 것은 DB, 혹은 App 양쪽에서 체크하기가 쉬운 것들입니다.
이런 것들은 DB 에서 체크하자, App 에서 체크하자고 정하는 것은
안전성을 서로에게 떠넘기는 것 같다는 느낌을 갖습니다.
이런 것은 굳이 얘기가 없더라도 양쪽에서 동시에 체크하면 그 아니 좋겠읍니까.

-- 어떤 사이트의 경우  날짜형을 varchar2로 선언해서 사용하고 있었는데,
-- APP에서... 날짜가 잘못 들어온 케이스가 있었습니다.
-- 예를 들어 2006-11-33 같이 존재할 수 없는 값이 들어왔습니다.
-- 쿼리에서는 to_date 등의 연산을 처리했으나...
-- 11-33은 존재하지 않으므로 해당 SQL에서는 오류가 발생하였습니다.
-- 결국 해당 업무는 서비스 불가.
-- 따라서 제약조건 아주 중요하고 전략적으로 가져가야 합니다.

맞습니다. 거기에 더하여 DB 에 날짜를 넘기는 경우처럼
2006-11-33 와 같은 한 개의 인수로 넘길 것이냐
2006,11,33 과 같이 년,월,일을 별도의 인수로 넘길 것인가에 대한 정책
즉 특정한 정보를 한 개의 인수로 보낼 것인가 아니면 그 보다 더 작은 단위로 구별을 해서
몇 개의 인수로 나누어서 보낼 것인가에 대한 정책도 중요합니다.
만약 년월일을 구분해서 별개의 인수로 넘긴다면
App 쪽에서도 약간이라도 simple 해지고
DB 쪽에서도 날짜의 유효성을 체크하는 데 약간이라도 더 좋습니다.
초보대왕님이 2006-12-09 12:52에 작성한 댓글입니다.
이 댓글은 2006-12-09 12:54에 마지막으로 수정되었습니다. Edit
초보대왕님께서 적절하게 지적하신듯 싶습니다.

저역시도 사용자레벨의 입력 입력체크는 가능한 최대한의 범위로 잡아야 한다고 생각합니다.

위의 본론과 별개의 문제지만..

DBA 분들중 보안을 신경쓰시는분들이 거의 전무한듯 싶습니다.

sql injection에 대해서 생각해 보신적 있으신지요?

DB의설계나.. 로직상의 성능,  효율성등도 좋지만..
보안설계가 이루어지지 않으면, 말짱 도루묵이 됩니다.

2006년 급격하게 DB관련한 보안 취약사례가 많았습니다

중국의 H모 자동화툴로 뚤리는 업체가 장난이 아니었지요..

 ' or 1=1 --; 이러한 입력이 들어오는 경우에
 어떻게 사용자 입력체크를 무시하겠습니까?

그러나 현업에서는 그러한 모든 사항을 다 준수하기 어렵다는데 있겠죠..

눈에 보이는게 잘돌아간다고.. 끝내던 시기는 지나 간듯 싶습니다.

웹기반이라면, 
서버사이드 스크립트, 클라이언트사이드 스크립트, DB , Cookie, Session, File 등의
사용자가 입력할 수 있는 모든 범위에  대하여
유효한 입력인지를 검사하여야 됩니다.

위의 사항에서는.. 어떤 분야의 전문가가 해결하는 부분이 아니라..
프로젝트 단위의 모든 사람이  분담해야지 가능한 일입니다.


이창민(Prosper)님이 2006-12-10 00:31에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5489오랫만입니다... [5]
임명순
2006-12-08
7872
5488백만년 만에 글쓰기... [8]
정재익
2006-12-06
10313
5487DBA가 되고 싶은 초보 개발자.. help드려요~ [1]
문제아
2006-12-06
8199
5486PK 사용하면 추세에 뒤떨어지는건지... [17]
박용운
2006-12-06
8473
5484송년회 공지 [10]
이상호
2006-12-06
8005
5482기초 database 하루 알바생 급구 [2]
급함
2006-12-05
8565
5478DBA 먹고 살기 빠듯하네요. [1]
DBA
2006-11-30
8774
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다