2010-01-27 5 views
2

데이터베이스 전체 고유 ID를 작성하려고합니다. 이 고유 ID는 해당 데이터베이스의 모든 테이블에있는 모든 행의 한 필드 여야합니다.여러 테이블에서 고유 ID 유지

  • 처럼 자동 증가 필드와 다른 모든 테이블에 트리거와 하나의 마스터 테이블을 만듭니다 :

    "여기에 삽입하기 전에

    내가 생각 한 몇 가지 방법이 있습니다 , master-table에 삽입 -> 자동 증가 값 얻기 -> 여기에 기본 키로이 값을 사용하십시오. "

    이전에 본 적이 있지만 하나의 INSERT를 만드는 대신 2 개의 INSERT를 수행합니다. 기대하지 않는 그 performant.

  • 모든 테이블에 uniqueId 필드를 추가하고이 필드를 PHP 생성 정수 ... unix-timestamp와 임의의 숫자로 더한 값으로 채 웁니다.

    그러나 큰 index_length 및 큰 data_length을 의미하는 데이터 형식으로 BIGINT을 사용해야했습니다.

  • 은 "UNIQUEID"아이디어와 비슷하지만 BIGINT의 instad 나는 VARCHAR을 사용하고이 값을 채울 uniqid()를 사용합니다.

+3

데이터베이스 전체 고유 ID의 목적은 무엇입니까? 모든 테이블에 기본 키가 있으면 모든 행에 이미 tablename.pkey로 구성된 고유 ID가 있습니다. – dnagirl

+0

이것은 무서운, 끔찍한 생각이며 고통과 불행만을 가져올 수 있습니다. –

+0

필자는 페이지에있는 모든 요소를 ​​주석으로 작성하거나 모든 요소에 등급을 부여하는 것과 같이 여러 번 생각했습니다. 나는 항상 이것이 쉬운 일이 될 것이라고 생각했다. @Ignacio : 그렇게 생각하면 기본 키로 사용하는 것에 대해 이야기하지 않습니다. 왜 여러 테이블을 통해 고유 한 식별자가 그렇게 나쁘다고 생각합니까? –

답변

2

당신이 uniqid() 솔루션, 내가 것 "투표"를주는 세 가지 아이디어 중 ... 의견을 찾고 있기 때문이다. 실행면에서 꽤 낮은 비용으로 보입니다 (하지만 구현은 아닐 수도 있음).

단순한 해결책은 생각합니다. 각 테이블에 GUID를 저장하고 GUID를 생성하는 MySQL의 함수가되도록 필드의 기본값을 설정하는 필드를 추가하는 것입니다. (나는 UUID라고 생각합니다). 이렇게하면 데이터베이스가 작업을 수행합니다.

그리고 임의의 아이디어를 생각해내는 정신으로 ... ID를 비동기 적으로 채우는 일종의 오프라인 프로세스가있을 수 있습니다. 모든 테이블에 적절한 필드가 있는지 확인하고 기본값을 0/비어있게 만드십시오. 그런 다음 오프라인 프로세스는 각 테이블에 대한 쿼리를 실행하여 고유 ID가 아직없는 행을 찾아서 채울 수 있습니다. 그러면 ID를 제어하고 정수를 증가시킬 수 있습니다. 물론 이것은 레코드가 삽입 될 때마다 즉시 고유 ID가 필요하지 않아야합니다.

+0

의견을 보내 주셔서 감사합니다. 지금까지 나의 개인적으로 가장 좋아하는 솔루션은 BIGINT 솔루션이며, 유일하지 않은 ID를 언제든지 생성하는 uniqid()를 두려워하게 만듭니다. 나는 또한 mysql의 UUID()에 대한 생각을 좋아한다. 그러나 이것은 정말로 긴 문자열이 될 것이다. 최대 9 개의 숫자를 가진 unix_timestamp + random number는 거의 50 % 작아서 고유하지 않은 ID를 생성하는 것이 실질적으로 불가능합니다. –