2013-07-02 21 views
12

Cho phép nói rằng tôi có hai loại đối tượng người dùng và tài khoản. Người dùng có thể có nhiều Tài khoản và chia sẻ chúng với Người dùng khác. Vì vậy, AccountA có thể có sẵn cho User1 và User2. Mặc dù AccountB chỉ khả dụng cho User1. Vì vậy User1 có hai tài khoản và User2 có một tài khoản.Nhiều người sử dụng Firebase

Cách "cơ sở firebase" để cấu trúc điều này là gì?

Ban đầu tôi nghĩ rằng người dùng có thể lưu trữ một loạt tài khoản mà họ thuộc về.

users: { 
    1: { 
    name: 'Ted', 
    accounts: [1, 2] 
    } 
    2: { 
    name: 'Frank', 
    accounts: [1] 
    } 
} 

accounts: { 
    1: { 
    name: "Checking" 
    }, 
    2: { 
    name: "Savings" 
    } 
} 

Hoặc tài khoản sẽ có một mảng người dùng.

users: { 
    1: { 
    name: 'Ted' 
    } 
    2: { 
    name: 'Frank' 
    } 
} 

accounts: { 
    1: { 
    name: "Checking", 
    users: [1, 2] 
    }, 
    2: { 
    name: "Savings" 
    users: [1] 
    } 
} 

Tôi tự hỏi mình có thể dễ dàng tìm được tài khoản cho người dùng để khi Ted đăng nhập, tôi có thể liệt kê các tài khoản mà anh ấy sở hữu mà không phải kéo xuống toàn bộ cơ sở dữ liệu. Vì lý do bảo mật, tôi không muốn tất cả dữ liệu đó trên máy của anh ấy.

Câu hỏi # 1 Quy tắc bảo mật có giúp giải quyết vấn đề này không? Bởi vì tôi có nghĩa là tôi đang lập kế hoạch để thiết lập quy tắc bảo mật của tôi như vậy mà người dùng chỉ có thể các tài khoản mà họ thuộc về. Tôi hy vọng rằng nếu tôi truy vấn "/ accounts", tôi sẽ chỉ lấy lại những tài khoản mà người dùng có thể truy cập ... không?

Câu hỏi # 2 Có cơ chế để truy vấn danh sách các mục hay không. Giống như "/ accounts/[1,2]" để tôi lấy lại các tài khoản "/ accounts/1" và "/ accounts/2"?

Cảm ơn mọi thông tin bạn có thể chia sẻ.

Trả lời

20

Trước khi nhảy vào chi tiết cụ thể, có một vài điều bạn sẽ muốn giữ lại trong tâm trí:

  1. Bạn thường sẽ muốn cấu trúc dữ liệu của bạn dựa trên các mẫu đọc của bạn. Vì vậy, nếu bạn cần tra cứu tất cả tài khoản người dùng đang ở, bạn sẽ cần phải lưu trữ danh sách đó ở đâu đó. Và nếu bạn muốn tìm kiếm tất cả người dùng được liên kết với tài khoản, bạn cũng cần phải lưu trữ danh sách đó ở đâu đó. Vì vậy, liên quan đến câu hỏi số 2, Firebase hiện không có bất kỳ khả năng truy vấn chung nào (như "/ accounts [1,2]"), mặc dù điều này có thể sẽ đến trong tương lai.
  2. Không thể sử dụng các quy tắc bảo mật để truy vấn dữ liệu. Bạn được phép đọc tất cả dữ liệu tại một vị trí hoặc không có dữ liệu nào. Vì vậy, liên quan đến câu hỏi số 1 của bạn, các quy tắc bảo mật sẽ không tự động truy vấn/tài khoản cho bạn.
  3. Quy tắc bảo mật không cho phép bạn tìm kiếm nội dung của một mảng cho một phần tử, nhưng chúng có thể kiểm tra sự tồn tại của một khóa trong một đối tượng. Do đó nếu người dùng 1 và 4 có quyền truy cập vào một thứ gì đó, có thể bạn sẽ muốn lưu trữ {1: true, 4: true} thay vì [1, 4].

Với ý nghĩ đó, tôi khuyên bạn nên lưu trữ các dữ liệu như ví dụ đầu tiên của bạn, nhưng mà không sử dụng các mảng:

users: { 
    1: { 
    name: 'Ted', 
    accounts: { 
     1: true, 
     2: true 
    } 
    } 
    2: { 
    name: 'Frank', 
    accounts: { 
     1: true 
    } 
    } 
} 

accounts: { 
    1: { 
    name: "Checking" 
    }, 
    2: { 
    name: "Savings" 
    } 
} 

này sẽ cho phép bạn dễ dàng nhận được tất cả các tài khoản cho một người dùng cụ thể. Nếu bạn cần cũng có thể đi theo hướng khác (tất cả người dùng cho một tài khoản), bạn sẽ phải sao chép thông tin đó và lưu trữ nó trong các tài khoản. Ví dụ:

accounts: { 
    1: { 
    name: "Checking", 
    users: { 
     1: true, 
     2: true 
    } 
    }, 
    2: { 
    name: "Savings", 
    users: { 
     1: true 
    } 
    } 
} 

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

+3

Bạn có thể chỉ định cách bạn đưa ra yêu cầu. Nếu bạn chỉ có tài liệu tham khảo firebase cho một người dùng cụ thể. Bạn sẽ nhận được thông tin về tài khoản của mình như thế nào – feresr

+2

@feresr bạn cần nhiều yêu cầu - người đầu tiên nhận danh sách tài khoản (/ người dùng/1/tài khoản) và một tài khoản cho mỗi tài khoản bạn quan tâm (vào/accounts/n). Đây là lý do tại sao đôi khi phải giữ một số thông tin tóm tắt trong/người dùng/x/tài khoản/y, chẳng hạn như biệt hiệu tài khoản. –

+0

OK. Bây giờ tôi có ý nghĩa. Cảm ơn! – feresr

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