2011-01-21 3 views
0

나는 사람들이 항상 높은 쓰기 테이블과 한 번 기록 된 데이터가 거의 항상 업데이트 나 삭제없이 영원히 유지되므로 사용자 세션 및 모든 로그 테이블에서 FK를 사용하지 않는다고 들었다.세션/로그 테이블 키 디자인 질문

는하지만 문제는 나는이 같은 colunms이된다 USER_ID가 activity_id ( SESSION_ID (시스템 활동 조회 테이블에 로그 작업 테이블을 연결하는) 사용자 로그 테이블을 연결 (사용자에게 세션이나 활동 로그를 링크) 부모 세션에서) ... 그리고 더 많은 colunms가 있습니다.

그렇다면 FK를 사용하지 않는다면 어떻게이 콜 럼을 "연관"것입니까? FK없이 테이블에 가입하고 사용자 정보를 얻을 수 있습니까? FK없이 올바른 데이터를 쓸 수 있습니까? 성능에 영향을 주거나 사람들이 방금 말하고 이것이 '아니오'라고 말하면됩니까?


내가 가지고있는 또 다른 질문은 FK를 사용하면 여전히 데이터를 조회 테이블에 연결할 수 있습니까?

답변

1

사실 mysql에서 실제 FK가없는 전체 데이터베이스를 빌드 할 수 있습니다. MyISAM을 스토리지 엔진으로 사용한다면, 어쨌든 FK는 실제가 아닙니다. 그럼에도 불구하고 조인 키가 일치하는 한 원하는 모든 조인을 수행 할 수 있습니다.

성능에 미치는 영향은 참조 된 테이블에 들어있는 데이터의 양에 따라 달라집니다. 테이블에 FK가 있고 데이터를 삽입하거나 FK 값을 업데이트하는 경우 추가 시간이 필요합니다. 삽입 또는 수정시 참조 무결성을 보장하기 위해 참조 테이블에서 FK를 조회해야합니다.

실제로 참조 무결성이 필요하지 않은 테이블에서 FK 대신 느슨한 열을 사용합니다.

AFAIK InnoDB는 현재 실제 외래 키를 지원하는 유일한 제품입니다 (MySQL 5.5에 지원되는 새로운 또는 업데이트 된 스토리지 엔진이없는 경우). MyISAM과 같은 스토리지 엔진은 구문을 지원하지만 참조 무결성을 실제로 검증하지는 않습니다.

+0

모든 테이블에 InnoDB가 있습니다. 웹 사이트는 소셜 네트워크이므로 데이터가 중요합니다. 소셜 네트워크의 로그 테이블 (사용자의 모든 움직임을 추적하므로 로그인 당 사용자 당 추적 세부 정보가 추가 된 최소 150 ~ 200 행을 상상할 수 있습니다.) 따라서 테이블 크기는 커질 것입니다. 새로운 사용자가 가입 할 때 사용자 테이블이 증가 할 것입니다. 새로운 활동이 추가되지 않는 한 활동 테이블은 대부분 읽기 전용이고 거의 업데이트되지 않습니다 – JRayder

0

FK는 "기록 로그"테이블에서 해를 끼칠 수 있습니다. 이런 종류의 테이블은 특정 시점에서 일어난 일의 정확한 상태를 유지하려고합니다.

FK의 문제점은 값을 저장하는 것이 아니라 값에 대한 포인터입니다. 값이 변경되면 기록이 손실됩니다. 히스토리 로그에 계단식 업데이트가 필요하지 않습니다. 참여할 수있는 "가짜 외래 키"를 가지고 있으면 좋지만, 내력을 보존하기 위해 관련 필드를 고집적으로 비정규 화하려고합니다.

+0

값 대신 포인터가 저장되는 rdbms는 무엇입니까? – Ronnis

+1

"포인터" 나는 대리 값으로 외래 키를 사용한다고 가정하고 있습니다. 대리 키를 사용하여 최신 값을 얻으면 로그의 목적을 상실하게됩니다. 로그는 최신 값과 관련이 없습니다. 시각. –