sql >> Databasteknik >  >> RDS >> PostgreSQL

i postgresql, är partitioner eller flera databaser mer effektiva?

Jag skulle rekommendera att du söker efter information på PostgreSQL-postlistorna om design med flera hyresgäster. Det har varit mycket diskussion där, och svaret kokar ner till "det beror på". Det finns avvägningar på alla sätt mellan garanterad isolering, prestanda och underhållsbarhet.

En vanlig metod är att använda en enda databas, men ett schema (namnutrymme) per kund med samma tabellstruktur i varje schema, plus ett delat eller gemensamt schema för data som är samma för alla. Ett PostgreSQL-schema är som en MySQL "databas" genom att du kan fråga över olika scheman men de är isolerade som standard. Med kunddata i ett separat schema kan du använda sökväg inställning, vanligtvis via ÄNDRA ANVÄNDARE kundnamn SET search_path ='kundschema, delat schema' för att säkerställa att varje kund ser sin data och bara sin data.

För ytterligare skydd bör du ÅTERVÄLLA ALLT FRÅN SCHEMA kundschema FRÅN offentligt sedan GRANT ALLT PÅ SCHEMA kundschema TILL kunden så de är de enda som har tillgång till det och gör samma sak med vart och ett av deras bord. Din anslutningspool kan då logga in med ett fast användarkonto som har nej GRANT ed åtkomst till alla kundscheman men har rätt att STÄLL IN ROLL att bli vilken kund som helst. (Gör det genom att ge dem medlemskap i varje kundroll med NOINHERIT set så rättigheter måste uttryckligen göras anspråk på via SET ROLE ). Anslutningen bör omedelbart SET ROLE till den kund det för närvarande fungerar som. Det gör att du slipper omkostnader för att skapa nya anslutningar för varje kund samtidigt som du behåller ett starkt skydd mot programmeringsfel som leder till åtkomst till fel kunds data. Så länge poolen gör en KASSA ALLA och/eller en ÅTERSTÄLL ROLL innan du delar ut anslutningar till nästa klient, kommer det att ge dig mycket stark isolering utan frustrationen av individuella anslutningar per användare.

Om din webbappsmiljö inte har en anständig anslutningspool inbyggd (säg, du använder PHP med beständiga anslutningar) så är du verkligen måste lägga en bra anslutningspool på plats mellan Pg och webbservern ändå, eftersom för många anslutningar till backend kommer att skada din prestanda. PgBouncer och PgPool-II är de bästa alternativen och kan praktiskt ta hand om KASSA ALLA och ÅTERSTÄLL ROLL för dig under överlämning av anslutning.

Den största nackdelen med detta tillvägagångssätt är omkostnaden med att behålla så många tabeller, eftersom din basuppsättning av icke-delade tabeller klonas för varje kund. Det kommer att öka när kundantalet växer, till den punkt där det stora antalet tabeller som ska undersökas under autovakuumkörningar börjar bli dyrt och där all operation som skalas baserat på det totala antalet tabeller i databasen saktar ner. Detta är mer ett problem om du funderar på att ha många tusen eller tiotusentals kunder i samma DB, men jag starkt rekommenderar att du gör några skalningstester med den här designen med dummydata innan du bestämmer dig för det.

Det ideala tillvägagångssättet är troligen enstaka tabeller med automatisk radnivåsäkerhet som styr tuppelsynlighet, men det är tyvärr något som PostgreSQL inte har ännu. Det ser ut som att det är på väg tack vare SEPostgreSQL-arbetet som lägger till lämplig infrastruktur och API:er, men det finns inte i 9.1.




  1. En översikt av logisk replikering i PostgreSQL

  2. Minnesläcka med OracleCommand

  3. Utforska SQL Server Restore Database med återställning vs inga återställningsalternativ

  4. Hur man hämtar den systemgenererade kontrollbegränsningens namn på tabellkolumnen i Oracle