2017-11-13 24 views
-1

사용자를 위해 cassandra에 테이블을 생성하고 있습니다. 사용자에게는 고유 한 user_id과 고유 한 display_name이 있습니다.기본 키를 두 번 조회하거나 기본 키가 아닌 다른 키를 한 번 더 빨리 검색 할 수 있습니까?

내 표는 현재 유사합니다

create table user (user_id text primary key, 
    display_name text, 
    joined timestamp, 
    last_seen timestamp, 
    ...); 

을 새로운 사용자가 나는 그들이 입력 한 표시 이름이 이미 다른 사람의 경우 확인해야 계정을 생성합니다. 내가 할 수있는 가장 빠른 방법은 뭐니?

이 프로젝트는 주로 나를위한 학습 프로젝트입니다. 세미 - 실제 세계 상황에서 몇 가지 NoSQL 개념을 실험하고 싶습니다. 에서 찾는 것보다 빠를 것이다 사용자 이름의 존재를 user_by_display_name을 찾고, 다음

create table user (user_id text primary key, 
    display_name text, 
    joined timestamp, 
    last_seen timestamp, 
    ...); 

create table user_by_display_name (display_name text primary key, user_id text); 

을 그리고 :


내 자신의 생각은 다음과 같이 두 개의 테이블을 사용한다는 것이다. 이것은 올바른 가정입니까?

는 느낌이 기본 키에 두 조회, user_by_display_name where display_name = ? 내가 해당 사용자에 대한 정보가 필요하면 user_iduser에서이 단일 조회보다 더 느려질 수 있습니다 사용 후 다른 조회.

+0

user_id PK를 만들고 display_name에 고유 제한 조건을 사용하십시오. – GurV

+0

@ GurwinderSingh 나는 cassandra에 제약이 있다고 생각지 않습니다. 제약 조건이 계산 상 비싸다고 생각했습니다. – theonlygusti

답변

0

귀하의 가정은 정확합니다. 설명한대로 비정규화할 수 있습니다. 먼저 쿼리를 디자인 한 다음 테이블을 작성합니다.

테이블은

CREATE TABLE users (
    user_id text, 
    display_name text, 
    last_seen timestamp, 
    PRIMARY KEY(user_id) 
WITH ...); 

CREATE TABLE users_by_display_name (
    display_name text, 
    user_id text, 
    last_seen timestamp, 
    PRIMARY KEY(display_name); 

처럼 1 조회를 할이 방법을 찾아야한다. 쓰기는 싸고 읽기는 비쌉니다. 가능한 경우 읽지 마십시오. 즉, 파티션이 1 행이고 키 값 데이터베이스에서 조회를 수행 중입니다. 두 번째 선택은 그리 비싸지 않을 것입니다.

설명 된대로 두 번째 테이블을 만들 수 있습니다. 대안으로 실행중인 cassandra의 버전에 따라 동일한 조회를 수행하기 위해 사용자 테이블에서 MATERIALIZED VIEW을 생성 할 수도 있습니다. 이들은 last_seen 속성을 자주 업데이트 할 때 행을 업데이트 할 때 delete를 수행 할 때 사용하지 않으려는 대상입니다. 그래서 그냥 display->userId로 제한하십시오.

일단 조회 설정을하면 두 사용자가 동일한 사용자 이름을 도용하는 경쟁 조건에 대해 여전히 걱정해야합니다. 이 경우 경량 트랜잭션을 고려할 수 있습니다. 즉, 비싸기 때문에 자주 이런 일을하지 않는 것이 좋습니다.

LWT는 "실제"트랜잭션이 아니고 표준 읽기/쓰기보다 느린 것처럼 일부 문제가 있습니다. 당신이 무엇을 얻고 있는지 당신이 알고 있는지 확인하십시오.

+0

최대 성능을 위해 검색을 수행하기 위해 어떤 명령을 사용해야합니까? – theonlygusti

+0

user_name이 있는지 확인하려면 다음과 같이 입력하십시오 : 'SELECT users users_by_display_name where display_name = 'x';'키 값 조회와 1 행이 빠릅니다. 또는 user_id의 기본 키가있는 users 테이블이 필요한 이유는 무엇입니까?사용자는 표시 이름으로 로그인합니다. 카산드라가 guid를 만들도록 할 수 있습니다. – Highstead

+0

그냥 이것을 업데이트하려고합니다. 분명히 'MATERIALIZED VIEWS'는 4.0에서 사용되지 않을 것입니다. – Highstead