Jag har samma problem att lösa och överväger även varianter. Eftersom jag har många års erfarenhet av att skapa SaaS-applikationer för flera klienter, tänkte jag också välja det andra alternativet baserat på min tidigare erfarenhet av relationsdatabaserna.
När jag gjorde min forskning hittade jag den här artikeln på mongodb supportwebbplats (tillagd långt tillbaka sedan den är borta):https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi -tenant.html
Killarna sa att de skulle undvika 2nd options till varje pris, vilket som jag förstår inte är speciellt specifikt för mongodb. Mitt intryck är att detta är tillämpligt för de flesta av de NoSQL-dbs jag undersökte (CoachDB, Cassandra, CouchBase Server, etc.) på grund av detaljerna i databasdesignen.
Samlingar (eller hinkar eller hur de kallar det i olika DB:er) är inte samma sak som säkerhetsscheman i RDBMS trots att de beter sig som behållare för dokument och de är värdelösa för att tillämpa bra hyresgästseparering. Jag kunde inte hitta NoSQL-databas som kan tillämpa säkerhetsbegränsningar baserat på samlingar.
Naturligtvis kan du använda mongodb rollbaserad säkerhet för att begränsa åtkomsten på databas/servernivå. (http://docs.mongodb.org/manual/core/authorization/)
Jag skulle rekommendera det första alternativet när:
- Du har tillräckligt med tid och resurser för att hantera komplexiteten i designen, implementeringen och testningen av detta scenario.
- Om du inte ska ha stora skillnader i struktur och funktionalitet i databasen för olika hyresgäster.
- Din applikationsdesign gör att hyresgäster endast kan göra minimala anpassningar under körning.
- Om du vill optimera utrymmet och minimera användningen av hårdvaruresurser.
- Om du ska ha tusentals hyresgäster.
- Om du vill skala ut snabbt och till en bra kostnad.
- Om du INTE tänker säkerhetskopiera data baserat på hyresgäster (håll separata säkerhetskopior för varje hyresgäst). Det är möjligt att göra det även i detta scenario men ansträngningen kommer att bli enorm.
Jag skulle välja variant 3 om:
- Du kommer att ha en liten lista med hyresgäster (flera hundra).
- Det specifika för verksamheten kräver att du kan stödja stora skillnader i databasstrukturen för olika hyresgäster (t.ex. integration med tredje parts system, import-export av data).
- Din applikationsdesign gör det möjligt för kunder (hyresgäster) att göra betydande ändringar i applikationens körtid (lägga till moduler, anpassa fälten etc.).
- Om du har tillräckligt med resurser för att snabbt skala ut med nya hårdvaronoder.
- Om du måste behålla versioner/säkerhetskopier av data per klient. Återställningen kommer också att vara enkel.
- Det finns lagar/regleringsbegränsningar som tvingar dig att behålla olika hyresgäster i olika databaser (även datacenter).
- Om du vill utnyttja de färdiga säkerhetsfunktionerna i mongodb till fullo, såsom roller.
- Det finns stora skillnader i storlek mellan hyresgäster (du har många små hyresgäster och få mycket stora hyresgäster).
Om du lägger upp ytterligare information om din ansökan kanske jag kan ge dig mer detaljerade råd.