2012-05-05 6 views
0

이것은 맞춤 소셜 네트워크 용입니다. |많은 ENUM의 경우 어떤 접근 방식이 훨씬 더 낫습니까?

  • 프로필 설정
  • SMS : 모든 사용자는 "프로필 설정"사용자가 변경할 수 있습니다

    약 30 설정, 그래서 몇 가지 범주가있어 있다 이메일 알림

  • 권한 설정
  • 보안 설정
  • 액세스 설정

은 내가 작은 테이블에 설정 제할 경우 다음과 같이 설정을 (열거 형)

을 유지하는 여러 테이블을 만든 (물론 고유 한 사용자 ID가 인덱스됩니다)

(사용자 ID는 탭의 모든 부분에서 기본 키입니다)

CREATE TABLE user_profile_settings (...) type=MyISAM; 
CREATE TABLE user_profile_notif (...) type=MyISAM; 
CREATE TABLE user_profile_auth (...) type=MyISAM; 
CREATE TABLE user_profile_security (...) type=MyISAM; 
CREATE TABLE user_profile_access (...) type=MyISAM; 

하나의 요청은 한 번에 여러 테이블로 내려 오며, 이는 또한 약간의 permay를 의미합니다. 이점은 다음과 같습니다. user_profile_settings에서만 읽을 수 있으면 해당 테이블에서 index'ed id를 요청합니다.

CREATE TABLE all_user_config (/***/) type=MyISAM; 

그것은 약 30 colums 포함되어 있지만 전체 시스템을 유지하기 위해 약간 어렵게이 같은 사용자가 가지고있는 모든 사용자 설정에 대해 하나 개의 행을 만들 :

두 번째 방법이다.

질문은 다음과 같습니다. 어떤 방법이 권장되며 10 억 개의 행에 적합합니까?

답변

1

개인적으로 나는 하나 개의 큰 테이블의 ENUM 필드를 유지하는 것이 좋습니다 것입니다, 그래서 당신은 단지 쿼리 대신 다섯 중 하나 큰 인덱스를 업데이트해야합니다. 다이어그램이 확실한 경우, 약간 어색한 class diagram은 페이스 북이 주장한 것입니다.

예상 사용자 수에 심각한 문제가있는 경우 (Facebook은 현재 약 9 억 명의 사용자를 보유하고 있음) MySQL과 같은 관계형 데이터베이스에 논리적 SQL 솔루션 (예 : 키 - 값)을 사용하는 것이 좋습니다. Cassandra 또는 문서 지향 MongoDB을 저장하십시오. 이들은 대용량의 크기로 확장하고 관계형 데이터베이스보다 분산 된 환경에보다 원활하게 배포하는 경향이 있습니다.

+0

하나의 테이블을 유지하는 것이 유지 관리하기가 쉽기 때문에 동의합니다. 그러나 전반적인 테이블에 대한 키를 4 바이트로 저장하는 상황에 도달 할 수 있지만 개별 값에 대해 1 바이트가 없어 질 수 있습니다. 행 길이가 가장 중요한 관심사라면 다른 접근 방식을 시도하는 것이 좋습니다. –

관련 문제