2014-04-01 3 views
1

현재 NodeJS & socket.io와의 웹 채팅을 개발 중입니다. 일부 관계형 데이터베이스 구조를 NoSQL로 변환하는 데 도움이 필요합니다. 저는 NoSQL 세계에 대해 매우 새로운 것입니다. 그래서 저는 여기서 이것을 묻습니다.couchDB (noSQL)로 관계형 데이터베이스 변환

내 목표는 특정 방에있는 모든 사용자를 나열 할 수 있도록 등록 된 사용자와 방을 저장하는 것입니다.

--Users 
John   
Jack   
James  

--Room 
Javascript 
PHP 
CSS 

--Relation 
Jack | PHP 
Jack | CSS 
John | PHP 
James | Javascript 

내가 실제로 어떻게해야합니까 다음 select user from relation where room like 'PHP'

이 CouchDB를 사용 :

는 SQL에서이 같은 짓을 한 것? 저장하고 나열하고 삭제해야합니다. 사용자는 고유 한 회의실도 있지만 사용자는 여러 회의실에있을 수 있습니다. 사용자가 연결을 끊으면 모든 곳에서 제거해야합니다. 사용자가 방을 나간 경우 해당 방에서 제거해야합니다. 방 "PHP"의 모든 사용자를 어떻게 선택합니까?

답변

0

데이터베이스의 정보를 유지해야한다고 생각하지 않습니다. 방은 사용자 ID의 배열을 포함하는 메모리의 키 여야합니다. 사용자가 방에 들어가면 배열에 항목을 밀어두고 떠날 때 나타납니다. 아직 여기에 몇 가지 개념을 설명하기 위해 당신은 당신이보기를 만들 그들이에있는 방으로 모든 사용자 싶어하기 때문에

지금 너무

{ 
    "user" : "scope77", 
     "room" : "php" 
} 

같은 문서를 작성 CouchDB를 사용하여 수행 할 수있는 작업입니다 인덱스 사용자가 같은 방

function(doc){ 
    if(doc.room) 
    emit(doc.room,doc) 
} 

이제이보기를 호출하면 특정 방의 사용자 목록이 반환됩니다. 그것 뿐이다

curl http://localhost:5984/db_name/design_name/view_name?key="php"

. 여기서 기억해야 할 점은 관계형 모델에서는 방과 사용자에 대해 별도의 테이블을 만들고이를 참조하여 데이터를 정규화하는 것입니다. couch db에서는 문서를 연결할 수 있지만 종종 중복되거나 비정규 화 된 데이터를 갖는 것이 더 쉽고 선호됩니다.

방을 위해 별도의 문서를 만들 수도 있지만 사용자 문서에 방 이름을 저장하는 것이 훨씬 좋습니다.

+0

안녕하세요, 귀하의 답변에 감사드립니다. 네, 우선 메모리에 저장하는 것을 생각하고 있었지만 키 인덱싱에 몇 가지 문제가있었습니다. 왜냐하면 내가 사용자 이름과 객실을 검색해야하기 때문에 .. 만약 내가 키를 방을 사용하면, 내가 모든 객실 키를 검색해야하기 때문에 나는 그가 연결을 끊을 때 사용자를 제거 할 수 없습니다. 하지만 어쩌면 내가 잘못 생각하고있을거야. – Scope77

관련 문제