2010-07-28 2 views
2

다음은 간단한 예제입니다.데이터베이스 디자인 질문 : 장소 주변의 GUID 처리

UserDetails (UserID INT UserGUID UNIQUEIDENTIFIER Name VARCHAR(50) Age INT) 
UserRatings (UserID INT Rating INT Date DATETIME) 
UserVotes (UserID INT Votes INT Date DATETIME) 

UserGUID는 주 테이블에만 있습니다.

응용 프로그램 계층에서는 GUID 만 구문 분석되며 절대로 INTS가 아닙니다. 이는 경쟁 업체가 내 사이트의 일부 주요 수치 (예 : 사용자 수)를 추측하지 못하도록하기위한 것입니다.

UserRatings 및 UserVotes 테이블과 관련된 SPROCS에서 UserID를 선언하고 모든 절차를 시작할 때 다시 구문 분석되는 UserGUID를 기반으로 설정해야합니다.

이것은 Users 테이블뿐만 아니라 주 테이블과 분기 테이블이있는 모든 다른 개체에 대해 발생하므로 이러한 DECLARE/SET 형식의 프로 시저가 여러 곳에 있습니다.

좋은 디자인입니까?

+0

+1 누군가가 마침내 GUID를 프라이 머리로 사용하는 것을 피하고 따라서 테이블의 키를 클러스터링하는 것을 기쁘게 생각합니다! –

답변

3

UserGUID는 기본 테이블에만 존재합니다. 응용 프로그램 계층에서는 GUID 만 구문 분석되며 절대로 INTS를 사용하지 않습니다. 경쟁 업체가 내 사이트 (예 : 사용자 수)의 일부 주요 수치를 추측하는 것을 막기위한 것입니다.

나에게 상당히 합당한 것 같습니다. 테이블에 UserRatings 및 UserVotes를 관련 sprocs가에서

, 나는 DECLARE의 사용자 ID를 가지고 다시 모든 절차의 시작 구문 분석지고있는 UserGUID에 따라 설정합니다.

는 또한 UserDetails+UserRatings에 걸친보기뿐만 아니라 UserDetails 테이블에서 GUID를 포함 UserDetails+UserVotes (한 번 또는 세 개의 테이블)를 정의 할 수 있습니다. 이렇게하면 테이블을 쉽게 쿼리 할 수 ​​있으며 GUID에서 먼저 ID를 추출하여 해당 테이블을 쿼리 할 필요가 없습니다.

업데이트 : 예 : 이 같은보기를 만들 수 있습니다, 자주 UserRatings를 조회해야합니다

CREATE VIEW dbo.UserRatingsWithDetails 
AS 
    SELECT 
     ud.UserGuid, ud.Name, ud.Age, 
     ur.UserID, ur.Rating, ur.Date 
    FROM 
     dbo.UserDetails ud 
    INNER JOIN 
     dbo.UserRatings ur ON ur.UserID = ud.UserID 

를 한 후 먼저 별도의 SELECT을 실행하지 않고 해당보기를 선택할 수 있습니다 다음에 (오른쪽 인덱스와

SELECT UserID, Name, Rating, Date 
    FROM dbo.UserRatingsWithDetails 
WHERE UserGuid = @SomeGuidValue 

을 외래 키 필드는 UserRatings입니다.) 매우 높은 성능의 JOIN입니다. 걱정할 필요가 없습니다.

+0

메신저 유지 관리가 아니라 성능/속도가 걱정됩니다. 매번 사용자 ID를 얻기 위해 매번 SELECT 문을 실행해야한다는 사실은 정말 좋아하지 않지만 어쩔 수없는 것처럼 보입니까? – super9

+0

@Nai : 내 답변을 내 대답보기 - 추가 SELECT 필요 없음 -보기 좋게 만든 VIEW - 경이로운 작품! –

+0

@marc_s : 오케이, 그냥 악마의 지지자의 권리를 재생합니다. 그래서 우리는 테이블을 UserRatingsWithDetails, 내 DECLARE/SET jiggy 다시 할 경우, WHERE 절은 잘못된 인덱싱을 만드는 GUID 반대로 인덱스 된 열을 검색 할 것입니다. 나는 이것이 시험이 끝나는 곳이라고 생각한다. – super9

1

uniqueidentifier UserGUID 열을 제거하고 일반 int UserID를 사용합니다. ID를 혼란 스럽거나 혼란스럽게 만들려면 신원을 제거하고 새로운 사용자를 삽입 할 때마다 1에서 2,147,483,647 사이의 값을 가진 무작위로 일반 int를 생성하는 함수/프로 시저를 사용하십시오.

+0

UserID 열에 인덱스가 클러스터 된 것으로 가정하면 인덱스가 엉망이되지 않습니다. – super9

+0

@Nai : 예, 갑자기 UserID INT에 임의의 값이있는 경우 GUID를 주/클러스터링 키 : 임의성으로 인해 테이블과 인덱스 조각화가 지붕을 통과합니다 .... –

+0

@ marc_s : 그래서 UserID 열과 함께 RandomUserID 열이 필요합니다. 하나는 디스플레이 용이고 다른 하나는 처리 용입니까? – super9

관련 문제