作为一个实例,可以考虑一个电子商务应用,用户可以上传尽可能多的商品,这些商品也有类别和子类别。
如何将user_id设置为发布的每个项目中的外键以及用户集合中的item_id,以查询特定用户发布的所有项目。
我们如何在Firestore中使用参考数据类型来设置外键?
还有其他方法可以设置外键吗?
数据库结构:
Users/doc_id/name..
Categories/fashion/clothing/auto_doc_id/type:denims
答案 0 :(得分:1)
如果您想要使用外键引用另一个表,您应该存储例如包含您想要使用的数据的用户ID,例如,假设您具有此结构
这是来自我的项目,我有一个喜欢的节点,每个都喜欢是推键,而在pushkey中我有每个喜欢帖子的用户的用户ID,帖子用pushKey表示< / p>
现在,我有另一个名为users的节点,在里面你可以看到我的userID
正如您所看到的,我在我的节点用户中拥有相同的用户ID。
所以我要做的就是这个
这就是我使用像userID这样的外键来处理2个不同节点的方法
现在,假设我想要从一张照片中获取所有喜欢,我只是循环浏览我的喜欢节点,每个推送键都是一张照片,所以我做同样的过程并得到每张照片的所有照片和喜欢。因此,如果我得到所有喜欢的照片,我也会得到喜欢的用户ID,因为它位于我喜欢的节点内,然后我可以直接访问用户节点并从喜欢的用户那里获取所有数据。
PS:没有特殊的方法或东西来创建外键,这取决于您的结构以及如何构建您的应用程序。您可以自己设置fk,考虑如何合并两个表并使用两者中的信息,在这种情况下,两个节点相互交互。
答案 1 :(得分:1)
以查询特定用户发布的所有项目。
为实现此目的,无需在发布的每个项目中将user_id设置为外键,也不需要在users集合中将item_id设置为外键。您只能将新属性添加到名为postedBy
的项目对象中,该对象将作为用户ID的值保存。要仅显示特定用户的项目,需要使用以下代码查询数据库:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference itemsRef = rootRef.collection("items");
Query query = itemsRef.whereEqualTo("postedBy", user_id);
还有另一种方法涉及复制数据。对于Firebase来说,这个tehnique没有问题。这是一种非常常见的做法,名为denormalization
,为此,我建议您观看此视频Denormalization is normal with the Firebase Database。这适用于Firebase实时数据库,但该概念也适用于Cloud Firestore。
换句话说,您可以创建一个新集合,您可以在其中存储由特定用户添加的所有项目。数据库结构应如下所示:
Firestore-root
|
--- users (collecton)
|
--- userId (document)
|
--- userItems (collecton)
|
--- itemId (document)
当您复制数据时,有一件事需要记住。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/拒绝一个项目,你需要在它存在的每个地方都这样做。
答案 2 :(得分:0)
假设您在shop / {shop_id}中有一个商品作为文档,其中有一个指向user / {user_id}的引用字段。 要以编程方式设置此引用:
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
DocumentReference userRef = firestore.collection("user").document({user_id});
Map<String, Object> map = new HashMap<>();
map.put("user", userRef);
firestore.collection("shop").document({shop_id}).update(map);
要检索该用户,您可以执行以下操作:
firestore.collection("shop").document({shop_id}).addSnapshotListener(this, (shopItemSnapshot, e) -> {
// Get the shopItem here
// ShopItem shopItem = shopItemSnapshot.toObject(ShopItem.class);
((DocumentReference) shopItemSnapshot.get("user")).addSnapshotListener((userSnapshot, e1) ->
// Get the user from the shopItem document
User user = userSnapshot.toObject(User.class);
});
});