2012-07-20 45 views
46

Có cách nào nhanh chóng để thực hiện truy vấn kiểu cơ sở dữ liệu với Firebase không?Truy vấn kiểu cơ sở dữ liệu với Firebase

Ví dụ:

Cho một tài liệu tham khảo căn cứ hỏa lực users với các lĩnh vực user_id, nameage, những gì sẽ là cách tốt nhất để làm một truy vấn tương tự như sau:

SELECT name FROM users WHERE `user_id`=147; 

SELECT COUNT(*) FROM users WHERE age=21; 

Trả lời

70

Nói chung, không. Firebase về bản chất là "cơ sở dữ liệu thời gian thực", liên tục phát trực tuyến cập nhật cho bạn dưới dạng thay đổi dữ liệu, do đó, việc truy vấn mục đích chung trở nên khó khăn hơn. Hiện tại, có một số nguyên thủy truy vấn được thừa nhận (được thừa nhận giới hạn) được cung cấp. Xem trang Queries/Limits trong tài liệu.

Bạn thường có thể làm việc xung quanh những hạn chế này thông qua nhiều phương pháp:

  • tên Sử dụng vị trí và ưu tiên một cách thông minh. Nếu bạn cấu trúc dữ liệu của mình là/users/[userid]/name, bạn có thể thực hiện "truy vấn" đầu tiên của mình bằng cách chỉ truy xuất/người dùng/147/tên. Nếu bạn biết bạn sẽ muốn truy vấn theo độ tuổi, bạn có thể sử dụng độ tuổi làm ưu tiên cho các nút của người dùng và sau đó thực hiện "usersRef.startAt (21) .endAt (21) .on ('child_added', ...)" để nhận được tất cả người dùng tuổi 21. Bạn vẫn phải tính chúng theo cách thủ công.
  • Thực hiện truy vấn phía máy khách. Nếu toàn bộ tập dữ liệu nhỏ, bạn có thể lấy toàn bộ tập dữ liệu và sau đó lọc/xử lý nó theo cách thủ công trên máy khách.
  • Chạy máy chủ riêng. Nó có thể kết nối với Firebase, đồng bộ hóa dữ liệu và sau đó trả lời "truy vấn" cho khách hàng. Nó vẫn có thể giao tiếp với khách hàng thông qua Firebase và Firebase vẫn có thể là kho lưu trữ dữ liệu chính, nhưng máy chủ riêng của bạn có thể thực hiện công việc để thực hiện truy vấn nhanh chóng.

Chúng tôi dự định cải thiện điều này theo thời gian vì chúng tôi nhận ra đó là điểm yếu so với truy vấn linh hoạt do hệ thống cơ sở dữ liệu quan hệ truyền thống cung cấp.

+1

Michael này, có nhóm của bạn thực hiện bất kỳ bước phát triển mới với truy vấn? –

+3

Không có tính năng mới đáng chú ý. Bạn có thể quan tâm đến bài đăng trên blog này mà chúng tôi vừa mới đưa ra, mô tả các phương pháp hay nhất để cấu trúc dữ liệu của bạn cho Firebase, do chúng tôi không hỗ trợ truy vấn giống SQL: https://www.firebase.com/blog/2013- 04-12-denormalizing-is-normal.html –

+3

Hiện tại, có một bài đăng trên blog và một thư viện mới cho phương pháp "Chạy với tư cách máy chủ riêng biệt" cho thấy việc tích hợp ElasticSearch: https: // www dễ dàng như thế nào. firebase.com/blog/2014-01-02-queries-part-two.html – Kato

24

Ông Lehenbauer dĩ nhiên là bậc thầy về mọi thứ Firebase, vì vậy hãy lắng nghe ông ấy. ;) Tuy nhiên, chủ đề cụ thể này là một trong những tôi đã được lao động hơn trong một vài tuần nay.

Dưới đây là một vài trong số những suy nghĩ của tôi, để nâng cao "Chạy một máy chủ riêng biệt" và "Client-side truy vấn" phản ứng:

ElasticSearch (một kịch bản Node.js)

Với một kịch bản node.js trên máy chủ, bạn có thể tích hợp ElasticSearch và cung cấp một số tìm kiếm nội dung vững chắc trong chưa đầy một giờ. Dưới đây là một bài viết trên blog và một lib mà làm cho nó dễ dàng hơn: https://www.firebase.com/blog/2014-01-02-queries-part-two.html

cache/thắc mắc chung

Đây có thể được xử lý bởi một quá trình máy chủ/cron mà đọc bảng và bản sao dữ liệu. Ví dụ: giả sử tôi muốn hiển thị "không khả dụng/có sẵn" cho tên đăng nhập của người dùng trong quá trình đăng ký, nhưng lưu trữ hồ sơ người dùng theo một ID duy nhất khác nhau vì một số lý do phức tạp.Cron/server của tôi có thể đọc tất cả các bản ghi từ bảng người dùng, sau đó chèn chúng vào một bảng khác được lưu trữ bằng địa chỉ email, với giá trị ID hồ sơ của người dùng (hoặc bất kỳ dữ liệu nào khác mà tôi có thể muốn biết) .

Cách tiếp cận dữ liệu trùng lặp này sắp xếp kỹ thuật lưu vào bộ nhớ cache thủ công và là thực tiễn phổ biến trong môi trường Không có SQL; chúng tôi đang kinh doanh không gian lưu trữ (được cho là rẻ và có sẵn) cho các quy trình tốc độ và đơn giản hóa.

truy vấn tùy chỉnh (sử dụng một hàng đợi)

truy vấn tuỳ chỉnh có thể được gửi qua XHR (ajax) trực tiếp đến một máy chủ, có thể làm lao động khổ sai và trả lại kết quả tốt hơn. Cách khác, bạn có thể sử dụng Firebase để kết nối với máy chủ back-end bằng cách sử dụng hàng đợi.

Khách hàng đặt yêu cầu truy vấn dưới dạng JSON vào bảng Firebase đặc biệt được gọi là queue và đang chờ phản hồi.

Các máy chủ lắng nghe cho queue.on('child_added', ...) và phục vụ dữ liệu trở lại sử dụng `queue_record.child ('phản ứng', ... dữ liệu ở đây ...)

này có một số ưu điểm tốt đẹp. Đối với một, bất kỳ số lượng các máy chủ có thể lắng nghe và phục vụ phản ứng, làm cho cân bằng tải một cách dễ dàng. Mã cho việc này rất đơn giản để thiết lập và covered in another thread tại đây trong SO.

Hy vọng điều này hữu ích!

+1

Bây giờ cũng có một lib để tích hợp tính năng Tìm kiếm Đàn hồi, điều này thật dễ dàng và làm cho các tìm kiếm dễ dàng như chiếc bánh, với chi phí của một tập lệnh node.js : https://www.firebase.com/blog/2014-01-02-queries-part-two.html – Kato

2

Tôi tạo ra CMS của riêng mình cho căn cứ hỏa lực như vậy khi tạo một bảng dữ liệu căn cứ hỏa lực i lọc nó với

var child = ref.child(); 
var compare; 
switch(filter){ 
      case "First_Name": 
      compare = child.First_Name; 
      break; 
      case "Last_Name": 
      compare = child.Last_Name; 
      break; 
      case "Phone_Number": 
      compare = child.Phone_Number; 
      break; 
      case "Department_Number": 
      compare = child.Department_Number; 
      break; 
      case "Position": 
      compare = child.Position; 
      break; 
      case "Status": 
      compare = child.Status; 
      break; 
      case "Tier": 
      compare = child.Tier; 
      break; 
     } 


     if(compare.match("^" + string)){ 
     //display items 
+0

Đây là những gì Lehenbauer có nghĩa là "truy vấn phía máy khách". Và tôi khuyên bạn nên sử dụng tương đương nhưng hơn thế nữa dạng có thể đọc được: 'if (child [filter] .match ('^' + string)) {' (thay thế mọi thứ từ dòng thứ hai trở đi) – Jonathan

Các vấn đề liên quan