2013-03-06 8 views
7

Một điều tôi đang đấu tranh với một chút với Firebase (hoặc các NOSQL dbs khác, tôi đoán?) Là một thực tế là các id không phải là một phần của cơ thể hàng". Vì vậy, nếu bộ sưu tập của tôi trông giống như:Theo dõi các id trong NOSQL db (firebase)

Books 
    |----ldJEIF 
      |----Title: "A Tale of Two Cities" 
      |----Author: "Charles Dickens" 
      |----Body: "It was the best of times..."  
    |----2difie 
      |----Title: "Moby Dick" 
      |----Author: "Herman Melville" 
      |----Body: "Call me Ishmael..." 

Nếu tôi lấy BooksList, và sau đó chọn myBook = books[ldJEIF] để làm điều gì đó với dữ liệu, myBook không có ý tưởng mà trong danh sách nó đến từ đâu. Nếu sau này tôi muốn thêm nó vào một số UserLibrary, ví dụ, tôi phải khử chuẩn hóa dữ liệu của mình hoặc thực hiện tra cứu ngược lại hoặc chuyển ldJEIF thay vì đối tượng sách và liên tục tra cứu dữ liệu. Tui bỏ lỡ điều gì vậy? Cách thực hành tốt nhất để giải quyết vấn đề này là gì?

Trả lời

16

Grab ID khi bạn nhận được dữ liệu

Đối với căn cứ hỏa lực ít nhất, khi bạn lấy lại hồ sơ, bạn cũng nhận được ID. Vì vậy, một giải pháp đơn giản là lưu trữ ID sau đó. Nếu bạn không có một nơi thuận tiện cho nó, bạn chỉ có thể dính nó vào dữ liệu:

firebaseRef.on('child_added', function(snapshot) { 
    var data = snapshot.val(); 
    data.id = snapshot.name(); // add the key as an id 
}); 

Tất nhiên, nếu bạn làm điều này, bạn phải nhớ lấy nó ra trước khi gửi lại dữ liệu đến máy chủ.

Sử dụng ảnh chụp

Một lần nữa cụ thể để căn cứ hỏa lực, bạn có thể giữ một ref để ảnh chụp và thông qua đó xung quanh thay vì chỉ các dữ liệu. Tôi không thực sự thích cách tiếp cận này một cách cá nhân, nhưng tôi đã không thể tìm ra nguyên tắc nội bộ gọn gàng mà nó vi phạm.

Đó là, tuy nhiên, cực kỳ tiện dụng trong một số trường hợp, vì bạn sẽ có tham chiếu đến dữ liệu, id và đối tượng Firebase bất kỳ lúc nào; khá tiện dụng.

Đặt ID vào dữ liệu

Một thực tế phổ biến trong NoSQL là chỉ cần đặt id vào dữ liệu - không có gì sai với khác này hơn một chút không gian lưu trữ thêm - không đáng kể trong hầu hết các trường hợp sử dụng. Sau đó, khi bạn tìm nạp các bản ghi, ID đã có trong dữ liệu và mọi thứ đều có dạng spiffy.

Đối với Firebase, bạn có thể tạo id và đặt id đó vào dữ liệu trong khi tạo. Sự thông minh sau đây đến từ một trong các ví dụ nguồn mở của chúng:

var data = {...}; 
var id = firebaseRef.push().name(); // generate a unique id based on timestamp 
data.id = id; // put id into the data 
firebaseRef.child(id).set(data); 
+0

Cảm ơn câu trả lời kỹ lưỡng. – sprugman

+3

Giữ một ảnh chụp xung quanh thực sự là một điều hoàn toàn an toàn/chính xác để làm. Các ảnh chụp nhanh là không thay đổi, vì vậy chúng sẽ không bị thay đổi từ bên dưới bạn ngay cả khi dữ liệu cơ bản được thay đổi. Mỗi ảnh chụp nhanh có hàm .ref() mà bạn có thể sử dụng để có được Tham chiếu Firebase mới cho dữ liệu đó. –

+0

Nếu tham chiếu firebase là tham chiếu firebase-Util -> Có một "lỗi" thú vị với giải pháp này (var data = snapshot.val(); data.id = snapshot.name();). Cuộc gọi lại được kích hoạt nhiều lần hơn. – Casero