Modelowanie dobrego schematu Mongodb naprawdę zależy od tego, w jaki sposób uzyskujesz dostęp do danych. W opisanym przypadku zindeksujesz klucz Members.user_id, który wydaje się być w porządku. Ale rozmiar twojego dokumentu będzie rósł, gdy będziesz dodawać przeglądających, redaktorów i administratorów. Ponadto Twój schemat utrudni tworzenie zapytań takich jak:
Zapytanie o projekty, w których user_id xxx jest edytorem:
Ponownie, być może nie musisz wykonywać zapytań dotyczących projektów w ten sposób, więc Twój schemat wygląda dobrze. Ale jeśli potrzebujesz odpytywać swoje projekty według user_id ORAZ roli, sugerowałbym utworzenie kolekcji 'project_membership' :
db.project_memberships.insert(
{
"project_id" : ObjectId("4d730fcfcedc351d67000032"),
"editors" : [
ObjectId("4d730fcfcedc351d67000002"),
ObjectId("4d730fcfcedc351d67000004")
],
"viewers" : [
ObjectId("4d730fcfcedc351d67000002"),
ObjectId("4d730fcfcedc351d67000004"),
ObjectId("4d730fcfcedc351d67000001"),
ObjectId("4d730fcfcedc351d67000005")
],
"administrator" : [
ObjectId("4d730fcfcedc351d67000011"),
ObjectId("4d730fcfcedc351d67000012")
]
}
)
db.project_memberships.ensureIndex({"editors": 1})
db.project_memberships.ensureIndex({"viewers": 1})
db.project_memberships.ensureIndex({"administrator": 1})
Lub jeszcze łatwiej... dodaj indeks do schematu projektu:
db.projects.ensureIndex({"memberships.role": 1})