7

제 질문의 첫 번째 부분에 대해 : 저는 최근에 관계형 데이터베이스에서 특정 테이블에 대한 고유 식별자를 갖는 이점과 절충점을 스스로에게 묻고있었습니다. 예를 들어 페이스 북 (FB) 그래프 API는 동일한 URL을 사용하여 "사용자", "이벤트", "페이지"등과 같은 여러 유형의 객체를 가져올 수 있습니다. 예 : https://domain/251906384206은 "이벤트"유형의 객체를 반환합니다. https://domain/195466193802264은 "Group"유형의 객체를 반환합니다.의 장점/단점과 관계형 데이터베이스에서 전 세계적으로 고유 한 식별자를 구현하는 방법은 무엇입니까?

덜 일반적인 API를 제공하는 것과 비교하여이 방법의 이점은 무엇입니까? https://domain/event/251906384206 또는 https://domain/group/195466193802264과 같이 사용됩니다. 이 경우, 각 오브젝트 유형에는 식별자 범위가 있기 때문에 유사한 오브젝트 유형에 대해 유사한 식별자가 사용될 수 있습니다.

질문의 두 번째 부분은 다음과 같습니다. 글로벌 고유 ID를 구현하기위한 옵션은 무엇입니까? 내 마음에 와서

두 가지 옵션은 다음과 같습니다

  1. 상속 기반 접근 방식을 사용하여 (테이블 당 클래스, 단일 테이블 등). 클래스 당 접근법이 사용된다고 가정하면 (수퍼 테이블은 고유 식별자 만 기본 키로 포함하고, 객체 유형을 나타내는 서브 테이블은 수퍼 테이블 및 추가 데이터와 동일한 식별자를 포함합니다), 수퍼 테이블과 서브 테이블간에 조인이 필요합니다. 수퍼 테이블에 병목이 생기기 때문에?

    • 고유 식별자
    • 개체 유형을 구체적으로 PRIMAR 키 및
    • 테이블 명을 포함하는 3 열을 가진 테이블을 제공.

    외부 식별자로 고유 식별자를 참조하는 열을 포함하는 개체 유형 당 추가 테이블. 각 오브젝트 유형별 테이블에는 고유 한 기본 키 범위가 있습니다.

두 가지 방법 모두 위에서 언급 한 FB API와 같은 일반적인 API를 제공 할 수 있습니다. 두 번째 방법은 객체 테이블 고유 기본 키를 내부적으로 사용하고 전역 고유 식별자 만 노출하도록 허용합니다. 그러나 전역 고유 식별자가 내부적으로 사용될 수있는 경우 두 번째 방법은 조인도 필요합니다.

세계적으로 고유 한 식별자의 장단점에 관한 경험이 있습니까? 구현을위한 모범 사례는 무엇입니까?

답변

0

글로벌 식별자를 구현하기 위해 제안 된 두 가지 방법 모두 큰 테이블의 조인과 데이터베이스의 레코드 수를 효과적으로 배가시키는 것입니다. 각 개체는 자체적으로 존재하지만 부모/레코드는 전역 ID로 존재합니다.

응용 프로그램/데이터 액세스 계층에서 전역 ID를 적용하는 것이 더 좋을 것이라고 생각합니다. 이것은 각 특정 유형의 객체에 대한 ID가 가능한 ID의 하위 세트에서만 제공되도록함으로써 쉽게 수행 할 수 있습니다. 예를 들어, 개체 유형을 지정하기 위해 모든 ID의 마지막/첫 x 비트를 예약 할 수 있습니다. ID의 나머지 부분은 "실제 ID"입니다.

spefic 테이블에 ID를 할당하는 동안 오류가 발생하는 경우 ID가 올바른지 확인하는 제약 조건을 추가 할 수 있습니다 (예 : ID < 4000 AND ID> 10000). 식별자에서 개체 유형에 대해 낭비되는 비트/바이트가 염려되는 경우 개체 ID (실제로 테이블에 저장 됨)를 형식 ID와 연결하는 데이터베이스 액세스 API에서만 전역 ID를 노출 할 수 있습니다 (오브젝트 유형에서 파생 됨).

0

"문제는 잘 설명되어 있지만 문제는 이미 반으로 해결되었습니다."

몇 가지 개념이 혼합되어 있습니다. 당신은 다른 데이터베이스 애플 리케이션을 확인합니다. 그러나 당신은 더 많은 정보를 얻는 대신에 더 혼란 스러울 것 같습니다.

여러 클래스의 여러 개체가 있고 데이터베이스에 저장하는 방법을 알고 싶습니다. 이것은 대개 객체 관계 매핑 (O.R.M.)의 "멋진 이름"에 의해 호출됩니다.

또한 글로벌 고유 식별자 (G.U.I.D.)를 사용하여 개체를 비즈니스/프로그래밍 개체 및 테이블의 행으로 식별하려고합니다.

또한 G.U.I.D.를 사용하려고합니다. 특정 유형의 클래스 또는 객체를 식별합니다.

앱을 제작한다고 가정 해 보겠습니다. 여기에는 여러 개의 개체가 있습니다. "사용자", "이벤트", "페이지"등과 같은 객체의 클래스가 몇 가지 있습니다. 같은 클래스/유형의 여러 객체를 가질 수 있지만 서로를 식별 할 수있는 방법이 필요합니다. 미시간에서 "John Doe"를 식별하려면 John Doe가 퀸즐랜드를 작성하십시오. 개체가 G.U.I.D 유형의 속성을 사용하게됩니다.

그럼 각 클래스 ("사용자"는 "사용자", 테이블 표준 ID는 단수이고 소문자, 무시할 수 있음, "이벤트"는 "이벤트"등) . 각 테이블에는 각 개체의 속성을 나타내는 여러 필드가 있습니다. 따라서 "user"는 "user_key GUID", "user_name varchar (100)"및 "user_birthdate datetime"과 같은 필드를 갖습니다. 다른 테이블도 마찬가지입니다.

필자는 "supertable"을 사용했지만 매우 특정적이고 일반적인 앱이 아닙니다. 나는 "사용자", "이벤트", "페이지"가 ​​섞인 테이블이 필요하다고 생각하지 않습니다. 나는 우리가 "고객"과 "회사"및 "사람"하위 테이블에 특정 추가 필드를 가지고있는 경우가있었습니다. 때로는 모든 고객에 대한 판매를 확인하고 "고객"테이블에 조인해야했습니다. 때로는 제품에 대한 기업 할인을 제공하고 "회사"하위 테이블을 찾아보아야했습니다.

이 일반화/"IS a"수퍼 테이블을 원할 경우, 수퍼 테이블 기본 키와 세부 테이블 기본 키에 대해 다른 필드가 필요하지 않으며 동일한 유형일 수 있습니다.

복합 키/복합 키 ("마스터 키"와 "기타"필드)를 사용하지 않으려면 단일 필드 기본 키를 사용하는 것이 좋습니다. 나는 또한 G.U.I.D. 키는 프로그래밍이 아니라 데이터베이스를 사용합니다.

The G.U.I.D. 정수 키보다 더 많은 메모리와 디스크 공간을 사용하지만, 복제가 매우 어려운 키를 얻기가 매우 빠르고 쉽습니다.

다시 말하지만 G.U.I.D.를 사용하는 것보다 데이터베이스에서 개체를 나타내는 방법이 더 중요합니다.

+0

"다시 한번 G.U.I.D를 사용하는 것보다 데이터베이스에서 개체를 나타내는 방법이 더 중요합니다." 틀렸어. 내 질문의 첫 번째 부분은 사용 관점에서 전역 고유 식별자를 사용하는 장단점을 나타냅니다 (예 : 사용하기 쉬운 API를 디자인 할 수 있어야 함). 세계적으로 고유 한 식별자를 필요로한다고 가정 할 때, 제 질문의 두 번째 부분은 전역 적으로 고유 한 식별자를 구현하는 방법에 대한 질문을 말합니다.분명히 몇 가지 옵션이 있습니다. 질문의 후반 부분에 대한 논의는 날짜 기반 디자인 문제를 고려해야합니다. – Scholle

+0

G.U.I.D. 대량의 레코드가 사용되고 있거나 여러 클러스터 또는 서버의 동일한 데이터베이스를 사용할 때 유용합니다. 복제 된 키가 없기 때문입니다. – umlcat

관련 문제