Geen eenvoudig antwoord, omdat veel afhangt van uw app-architectuur, gebruiks- en querypatronen, de verdeling over clients (dwz:zullen de gebruiksniveaus ongeveer hetzelfde zijn tussen clients, of zou u kunnen hebben dat 10% van de clients 90% van de resources), hoeveel u kunt uitgeven aan code vs ops-beheer en een hele reeks andere zaken. Hier zijn enkele dingen om te overwegen:
1) het hebben van één database maakt uw ops-beheer eenvoudiger, vereist minder computerbronnen en stelt u mogelijk in staat beter uit te schalen, maar het coderen van de toegangslaag zal moeilijker zijn en u moet uw beveiligingslaag om voor de hand liggende redenen echt goed ontwerpen. U verbruikt ook minder bronnen aan de client/webserver-kant, aangezien er veel minder verbindingen zullen zijn.
Er zijn twee populaire schema-opties bij het benaderen van één monolithische database:
- U kunt alle vergelijkbare gegevens in één verzameling plaatsen (dwz:profielen voor alle accounts gaan in dezelfde verzameling) en elk document een client-ID-sleutel geven om te identificeren welke gegevens bij welk account horen. Dit kan u de beste opties bieden (afhankelijk van uw schema-architectuur) om uit te schalen met de minste computerresources.
- Een andere optie is om klantgegevens te scheiden op verzamelingen - elke klant heeft zijn eigen verzamelingen in de database die worden geïdentificeerd met een clientid-prefix (dwz:clientid_userprofiles).
2) de database per client-optie geeft u meer hoofdpijn bij het beheer van de ops en kost meer omdat u meer computerresources nodig heeft. Aan de andere kant zouden uw codeerkosten lager moeten zijn omdat de code gemakkelijker te schrijven is. Het stelt u ook in staat uw bronnen beter te verdelen tussen zware en lichte gebruikers. U kunt bijvoorbeeld clients voor zwaar gebruik naar krachtigere machines verplaatsen en sharding per klant aanbieden.
3) je zou een combinatie van de twee opties kunnen bieden - speciale databases voor high-end gebruikers (accounts die meer betalen), en vervolgens een gedeelde database met gegevens gescheiden door verzameling voor low-end clients en test/freemium-accounts.
Merk op dat als u de route met vele databases volgt, u de opstartoptie --smallfiles moet bekijken. Dit zal je helpen in situaties waarin je veel mensen "testaccounts" hebt, maar die er niet veel mee doen.
Hoe dan ook, hopelijk geeft het bovenstaande je stof tot nadenken. Zoek op https://groups.google.com /forum/?fromgroups#!searchin/mongodb-user/multitenant aangezien er een aantal discussies zijn geweest in de Mongo-forums over dit specifieke onderwerp.
Wat betreft de auditimplicaties, hangt af van het niveau van naleving van audits waaraan u zich moet houden. Als u fortuin 1000-klanten verwacht, zullen uw nalevingsvereisten veel hoger zijn (en veel duurder - denk aan $ 10 tot $ 100 of duizenden dollars), dan wanneer uw klanten startups zijn die misschien nog nooit van SAS70 hebben gehoord, enz. Het antwoord hangt ook af van het type gegevens dat u opslaat - zijn het financiële gebruikersgegevens of zijn het alleen gebruikersforums? Kortom, als u zich zorgen maakt over het doorstaan van beveiligingsaudits voor grote bedrijven in de toekomst, denk dan niet eens aan de gedeelde database-aanpak.