2010-02-01 2 views
3

여러 REST API 데이터 소스의 항목에 메타 데이터를 저장하기 위해 매시업을 구축 중입니다. 모든 다른 데이터 소스에서 요약 된 데이터를 기반으로 일반적인 피드 (가장 최근, 최고 평점, 최다 조회 등)를 생성하고 태그 (예 : 다 대 다 관계)를 추가 할 수 있기를 바랍니다.SQL 디자인 패턴 : 다른 사이트의 여러 고유 ID를 매시업에 저장하려면 어떻게합니까?

제 문제는 각 데이터 소스가 REST API를 통해 고유 ID를 발행하는 다른 방법이 있다는 것입니다. 내 MySQL 데이터 모델에 사용할 최상의 패턴에 대한 제안이 필요합니다.

나의 현재 솔루션은 모든 항목과 복합 키 1 개 테이블을 사용하는 것입니다하지만 긴 조인 및 CakePHP의 기본적 복합 키를 처리하지 않습니다

datasource_id smallint, 
datasource_item_id VARCHAR(36), // some datasources issue alpha keys 

Q : 그것을인가 내 테이블에 자동 증가 기본 키를 추가하고 내 내부 조인/인덱스를 외부 UID에서 내부 UID로 변환하는 것이 좋습니다. :

아이디 INT (10) 부호 NOT NULL AUTO_INCREMENT,

Q : 열거 형은 (아마도 10 개의 서로 다른 데이터 소스를 가져야한다) datasource_id 저장하기위한 효율적인 데이터 타입인가?

Q : 장기적으로 더 좋고 확장 가능한 결과를 산출하는 다른 방법이 있습니까?

답변

1

대부분 내가 이미 고려한 해결책 만 확인할 수 있습니다.

테이블 스키마에 사용 된 저장소 유형이 데이터 유형과 동일 할 필요는 없으므로 (따라서 SQLite 2는 untyped이고 SQLite 3은 so few types 임) 첫 번째 충동은 현재 솔루션.

임의의 ID (즉, 모델링하는 특성에 기반하지 않은 ID)는 자신의 데이터베이스에 내부적으로 보관해야한다는 또 다른 생각에 이어 두 번째 해결 방법을 제안합니다. id 열 . 이 학교의 한 가지 이유는 테이블이 다른 사람의 내부 구조에 의존하기를 원하지 않는다는 것입니다. cakePHP는 복합 키를 지원하지 않으므로 가장 실용적인 옵션입니다.

다른 해결책은 기본 키 열을 다른 복합 키 열의 데이터를 연결하는 것입니다. 즉, 자동 증분 ID와 마찬가지로 추가 열을 추가하지만 임의의 값이 아닌 값은 저장하지 않습니다. 이것은 비정규 화의 범주에 속하며 모든 경고와 경고를 의미합니다.

SQL이 2 차 로직 인 경우 각 데이터 소스에 자체 테이블을 쉽게 제공 할 수 있습니다. SQL은 첫 번째 주문이므로 확장 성이 뛰어난 솔루션은 아닙니다.

처음 세 개 모두 단점을 가지고 있습니다. 각 데이터 소스에는 자체 ID 유형이 있습니다. 동일한 열에있는 다른 소스의 ID를 저장할 때 (MySQL이 CHECK 절을 지원하지 않으므로) 트리거 형식의 데이터베이스 수준에서 유형 무결성을 적용하기 위해 추가 제약 조건을 정의해야합니다.

Q : 열거 형은 datasource_id (10 개의 다른 데이터 소스가 있어야 함)를 저장하기위한 효율적인 데이터 유형입니까?

ENUM의 storage requirements은 고유 한 값의 수에 따라 1 또는 2 바이트입니다. 10 개의 데이터 소스에서 행당 하나의 바이트 만 사용해야합니다. 그래도 4 비트/행을 조금 넘게 낭비합니다. 그것이 효율적이든간에 나는 당신에게 달려 있습니다.

관련 문제