sql >> Databasteknik >  >> RDS >> Mysql

Vad tycker du om att använda textidentifierare i tabellkolumner när du närmar dig databasen med normalisering och skalbarhet i åtanke?

Den första är mer normaliserad, om den är något ofullständig. Det finns ett par tillvägagångssätt du kan ta, det enklaste (och strängt taget, det mest "korrekta") kommer att behöva två tabeller, med den uppenbara FK-begränsningen.

commentid ---- subjectid ----- idType
--------------------------------------
1                22            post
2                26            photo
3                84            reply
4                36            post
5                22            status

idType
------
post
photo
reply
status

Om du vill kan du använda en char(1) eller liknande för att minska effekten av varchar på nyckel/indexlängd, eller för att underlätta användningen med en ORM om du planerar att använda en. NULL är alltid ett besvär, och om du börjar se dem dyka upp i din design kommer du att ha det bättre om du kan komma på ett bekvämt sätt att eliminera dem.

Den andra metoden är en jag föredrar när jag hanterar mer än 100 miljoner rader:

commentid ---- subjectid
------------------------
1                22    
2                26     
3                84     
4                36     
5                22     

postIds ---- subjectid
----------------------
1                22   
4                36   

photoIds ---- subjectid
-----------------------
2                26    

replyIds ---- subjectid
-----------------------
3                84    

statusIds ---- subjectid
------------------------
5                22     

Det finns naturligtvis också den (något denormaliserade) hybridmetoden, som jag använder flitigt med stora datamängder, eftersom de tenderar att vara smutsiga. Ange helt enkelt specialiseringstabellerna för de fördefinierade idTypes, men behåll en adhoc idType-kolumn i commentId-tabellen.

Observera att även hybridmetoden bara kräver 2x utrymmet för den denormaliserade tabellen; och ger trivial frågebegränsning av idType. Integritetsbegränsningen är dock inte enkel, eftersom den är en FK-begränsning på en härledd UNION av typtabellerna. Mitt allmänna tillvägagångssätt är att använda en utlösare på antingen hybridtabellen eller en motsvarande uppdateringsbar vy för att sprida uppdateringar till rätt undertypstabell.

Både det enkla tillvägagångssättet och det mer komplexa tabellupplägget av subtyp fungerar; fortfarande, för de flesta ändamål gäller KISS, så jag misstänker att du förmodligen bara borde introducera en ID_TYPES-tabell, den relevanta FK, och vara klar med den.




  1. QPSQL-drivrutinen har inte laddats Qt

  2. Hur Postgresql KOPIERA TILL STDIN Med CSV gör om konflikter gör uppdatering?

  3. MySQL gå med och exkludera?

  4. Använda index i SQL Server-minnesoptimerade tabeller