学习如何在Couchbase中建立文档之间的关系。也许这个问题更好地用例子来说。
假设有酒店和宾客。很多酒店和很多客人。
{
"_id": "hotel1"
"type": "hotel"
"name": "Hilton"
...
}
{
"_id": "hotel2"
"type": "hotel"
"name": "Hampton"
...
}
{
"_id" : "guest1"
"type": "guest"
"name": "John"
...
}
{
"_id" : "guest2"
"type": "guest"
"name": "Erin"
...
}
建立关系的一种方法是在酒店文档中嵌入访客ID,但这会随着时间的推移而变得非常大。
另一种方法是在客人文档中嵌入酒店ID,并为每个酒店创建视图以列出其客人。由于酒店随着时间的推移而添加,因此无论何时创建酒店文档,都需要动态添加这些视如果有500家酒店,他们将有500个观看次数。
为此类数据建立关系以及检索酒店客人数据的更简洁方法是什么?
答案 0 :(得分:3)
我喜欢这里发布的其他答案;但是,我不相信有足够的解释,因为这是教育。如果我正确理解你的问题,那么设计中存在一些问题就是要克服这个问题。
您需要指出在每个酒店文档中嵌入访客列表是不可行的。同样,在客人文档中嵌入酒店列表也很麻烦,但并不那么不现实。
我在这里缺少的是,酒店需要三个实体才能入住:
Reservation
实体应包含访客,酒店以及特定住宿的任何相关详细信息。您不能将此信息放入酒店或访客文档中,因为您最终会有太大而无法正常运行的对象(尽管这可能需要一段时间)。如果有疑问,总是在表现良好的方面犯错。
就像其他答案所指出的那样,创建由宾馆和宾馆宾客拉客人的观点是非常微不足道的。
答案 1 :(得分:3)
假设Couchbase视图的工作方式与CouchDB视图相同。
将酒店ID放入访客文档中。只有一个视图,为客人访问的每家酒店发出一个复杂的密钥。例如
for (var visit in guest.hotels) {
emit([visit.hotel_id, visit.date], guest_id);
}
然后,您可以通过
查询视图来获取酒店的访客列表startkey = ['hotel1'] and endkey = ['hotel1', {}]
您还可以在特定日期之间获取访客列表:
startkey = ['hotel1', date1] and endkey = ['hotel1', date2]
答案 2 :(得分:1)
我认为在您的情况下,您可以创建关系地图文档:
{
"hotel_id": "hotel1",
"guest_id": "guest1"
}
因此它将存储酒店/客人ID。然后,您可以创建2个通用视图:" ListHotelGuests"和" ListGuestHotels"。您可以根据应用程序业务逻辑对这些视图进行过滤,分组等。