2010-01-24 3 views
0

필자는 오랫동안 PHP를 작성해 왔지만, 항상 자신을 배웠던 기술이었고 테이블 조인에 대한 자신감의 사소한 위기에 처했습니다! MySQL의 가정 auto_increments를 사용하여 MySQL의 MyISAM 테이블에 참여하기

auth데시벨 포함 MyISAM 테이블 userspermissions :

users 
- id (auto increment) 
- email 

permissions 
- id (auto increment) 
- name 

은 다 대다 (또는 일대 다), 난 항상 사용했습니다 브리지 테이블에 이러한 테이블을 조인하려면 그래서 같은 :

user_permissions 
- id (auto increment) 
- user_id 
- permission_id 

(나는 이노 관계 할 알고 있지만, 그것은 또한 더 복잡하고 돼지 더 많은 메모리, 나는 MYISAM와 함께 머물하고 싶은 질문의 목적 때문에)

내 질문은 이것입니다 : 자동 증분 키를 사용하여 테이블을 조인하는 것이 현명한가 아니면 자체적으로 추가 키를 생성해야합니까?

테이블이 손상되어 다시 작성해야하거나 두 개의 DB로 미러링을 시작하고 키가 동기화되지 않으면 문제가 발생할 수 있음을 알고 있습니다.

각 행 (조인에 사용됨)에 대해 고유 한 해시를 생성하면 해시 생성 및 모든 데이터 삽입 전에 새로운 것인지 확인하는 오버 헤드가 있다는 것도 알고 있습니다.

다른 사람들은 어떻게합니까? 이러한 문제는 실제 상황에서 본 것입니까?

시간 내 주셔서 감사합니다.

답변

-1

이것은 일반적으로 서로 게이트 키를 사용하는 것 사이의 결정입니다 자연 키 (이름이나 은행 계좌 번호와 같이 저장되는 엔티티와 관련하여 의미 상 의미가있는 키)

귀하의 경우, 작동 할 자연스러운 키가 분명하지 않습니다 (사용자 테이블의 모든 측면이 변경 될 수 있습니다 - 결혼 후 이름 변경 등). 관계를 유지하면서 키의 변형 가능성이없는 경우 자연 키가 필요합니다. 예를 들어 요소의 주기율표에 요소 이름 (Au, He, Es 등)이있을 수 있습니다 (새 요소를 추가하는 것 외에는 변경 될 수는 없지만 어쨌든 아무 일도 일어나지 않을 수 있습니다 ...).

데이터 손상의 경우 백업이 손상 될 수 있으므로 백업이 가장 좋습니다. 일반적인 작업에서는 마이그레이션 또는 동기화 할 때마다 항상 기본 키를 보존 할 수 있습니다. db가 제공하는 자동 증가 대신 정교하게 복잡한 대리 키를 사용하는 것은 삽입을 복잡하게하기 때문에 위험 할 수 있습니다 (고유 한 트랜잭션을 보장하고 트랜잭션 안전 방식으로 충돌을 처리해야 함) ...실제로 정교하게 생성 된 대리 키는 데이터 손상의 경우에는 도움이되지 않습니다 (레코드와 상관시킬 방법이 없음).

자연스러운 PK는 사용자의 전자 메일이 오버 헤드가 많을 때마다 전자 메일이 변경 될 때마다 업데이트해야하며 2 개의 계정간에 전자 메일 주소를 교환하는 작업은 복잡하며 인덱스는 int가 아닌 넓은 값에서 훨씬 효율적이지 않습니다. 트레이드 오프는 자동 증가 키를 위해 기울어집니다.

좋은 작성자

은 여기에 있습니다 :

http://decipherinfosys.wordpress.com/2007/02/01/surrogate-keys-vs-natural-keys-for-primary-key/

0

아담은 허가에 가입하고 같은 사용자 갈 것 : 다른 테이블에서이 참조 할 않는

SELECT  u.*, p.* 
FROM  user_permissions up 
INNER JOIN users   u 
ON   up.user_id = u.id 
INNER JOIN permissions  p 
ON   up.permission_id = p.id 

user_permission의 id 열이 정말 필요가 없습니다. 이 ID를 남겨두면 (user_id, permission_id) 기본 키가됩니다 (이 경우 자동 증가 없음). 만약 당신이 별도의 ID 컬럼을 가지고 있다면 반드시 UNIQUE 제약 조건을 (user_id, permission_id) 이상으로 덧붙여 야합니다. (user_id, permission_id)

+0

덕분에, 나는 SQL을 수행하는 방법을 알고 - 문제는 조인에서 auto_increments의 안전한 사용에 대한 자세한입니다. –

+0

나는이 문제를 이해하지 못한다고 생각한다. "안전한"이란 무엇입니까? 자동 증가는 가입과 어떤 관련이 있습니까? –

+0

질문에 따라 데이터베이스가 손상되거나 미러링이 실패 할 경우 관계가 auto_incremented 값으로 구축되면 관계가 손실 될 위험이 있습니까? –

관련 문제