Firebase용 Query
Where절들이 없다? Join 문장이 없다? 문제는 없다!
SQL경험을 토대로, NoSQL 자료구조과 Firebase의 동적,실시간 Query환경의 자유로움을 이해하는데 어느 정도의 시간이 걸릴 수 있다.
* Select a user by ID ( WHERE id=x )
- Firebase궈리에서, record들은 "경로"에 저장이 된다. 경로는 데이타 계층구조에서 단순하게 URL이다. 샘플 데이타에서, 유저정보는 /user에 저장 되었다. 그래서 id를 통해서 record를 조회한다면, 단순하게 URL에 추가를 한다. (~/user/123 )
new Firebase('https://example-sql.firebaseio.com/user/123')
http://jsfiddle.net/katowulf/vQEmt/2/
* Find a user by email address ( WHERE email = x )
- 그러나 사용자를 URL 경로에 속하지 않는 무언가로 찾아야 하는 것은 어떻게 하나?
정렬된 데이타가 친숙하게 되는 것이다. Email주소가 일반적 조회 방법이 되기 떄문에,
새 record를 추가할때마다 setPriority()를 호출 할 수있다. 그리고, 우리는 나중에 그들을 조회할때 사용할 수 있다.
new Firebase('https://example-sql.firebaseio.com/messages')
.startAt(startTime).endAt(endTime)
http://jsfiddle.net/katowulf/vQEmt/2/
- 대부분의 경우에 정말 멋지고 유용하지만, 우선순위를 사용할수 없는 경우에는 어떻게 하나? 또는 검색을 위해서 하나의 field 보다 많은 것이 필요하면? 그러면 그것은 어떤 index들을 적용할 시간이다.
* Get messages posted yesterday ( WHERE timestamp BETWEEN x AND y )
- 어떤 범위의 데이타를 조회하려고 하는 경우에는 어떻게 하나? 우선순위 없이 데이타를 정렬하는 것은 이와 같이 꽤 유용하다.
http://jsfiddle.net/katowulf/EZUtP/
* Paginate through widgets ( LIMIT 10 OFFSET 10 )
- 무엇보다 먼저, 일부 주장을 만들어 보자. 만약 정적 data set에 관해 이야기 하지 않는 다면, 페이지 번호를 매기는 행위는 매우 애매모호 해진다.
예를 들어, 내가 어떻게 기록이 삭제되거나 끊임없이 자주 추가되어 변화하는 데이터 세트의 페이지 번호를 정의합니까? 어떻게 offset를 정의 합니까? 마지막 page는? 만약 이 질문들의 답변이 다르다면, 페이지 매기기는 아마도 올바른 답변이 아닐것이다.
작은 페이지 매기기, 정적 data set(1 MB 이하)은 클라이언트 side에서 전체 가능하다.
큰 정적 data set의 경우는, 좀 더 도전을 받게 되는 상황이다.
추가 저장만을 하는 data라고 가정하면, 위의 예제들 처럼 정렬된 data를 사용할 수 있고,
각 메시지의 페이지 번호나 절대 증가 수치를 할당하고 startAt()/endAt()를 사용할 수 있다.
new Firebase('https://example-sql.firebaseio.com/messages')
.startAt(2) // assumes the priority is the page number
.endAt(2)
그러나 예제(widget) 경로와 같이 작업을 하는 경우, 우선 순위를 갖고 있지 않다면?
우선 순위를 위해 null를 전달하여 이전 페이지의 마지막 record를 단순하게 "start at"으로 할수 있다.
new Firebase( 'https://example-sql.firebaseio.com/widget' )
.startAt( null, lastWidgetOnPrevPage )
.limitToFirst( LIMIT + 1 ) // add one to limit to account for lastWidgetOnPrevPage
http://jsfiddle.net/katowulf/qJNJW/
* Join records using an is ( FROM table1 JOIN table2 USING id )
- Firebaser(Firebase 개발자)가 비정규화(denormalization)에 대해 많은 이야기를 하고 있고,이는 좋은 충고이지만, 어떻게 한번 분리를 시킨후에 다시 합칠까요?
자, 그게 보이는 것보다 매우 파격적으로 단순하다.
Firebase는 실시간 sync 플랫폼이다. 속도와 효율성을 위해서 만들어 졌다.
추가 참조를 만드는 것을 걱정할 필요가 없으며, 조회하고자 하는 데이타 만틈 많은 경로를 살필 수 있다.
var fb = new Firebase( 'https://example-sql.firebaseio.com/' )
fb.child('user/123') {
fb.child('media/123')
}
http://jsfiddle.net/katowulf/SSnfr/
<원문 사이트>
쿼리들, 파트1 : Firebase용으로 변환된 일반 SQL 쿼리들 , updated Nov 4, 2014
https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html
'Cloud - Google,AWS > Firebase & Real-Time' 카테고리의 다른 글
6개의 추천할 만한 SDK : 모바일 앱에 그룹Chat을 추가할 수 있는 (0) | 2016.11.25 |
---|---|
PubNub Design Patterns (0) | 2016.11.07 |
Real-Time Web Technologies (0) | 2016.11.07 |
Firebase and Backend Logic의 구성안... (0) | 2016.09.30 |
(1) 소개 - Firebase (0) | 2016.07.05 |