sql >> Database teknologi >  >> RDS >> Mysql

Hvad er din mening om at bruge tekstlige identifikatorer i tabelkolonner, når du nærmer dig databasen med normalisering og skalerbarhed i tankerne?

Den første er mere normaliseret, hvis den er lidt ufuldstændig. Der er et par tilgange, du kan tage, den enkleste (og strengt taget den mest 'korrekte') har brug for to tabeller med den åbenlyse FK-begrænsning.

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

idType
------
post
photo
reply
status
 

Hvis du vil, kan du bruge en char(1) eller lignende for at reducere varcharens indvirkning på nøgle/indekslængde eller for at lette brugen med en ORM, hvis du planlægger at bruge en. NULL'er er altid en plage, og hvis du begynder at se dem dukke op i dit design, vil du være bedre stillet, hvis du kan finde ud af en bekvem måde at fjerne dem på.

Den anden tilgang er en, jeg foretrækker, når jeg har at gøre med mere end 100 millioner rækker:

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

Der er selvfølgelig også den (lidt denormaliserede) hybride tilgang, som jeg bruger meget med store datasæt, da de har en tendens til at være snavsede. Angiv blot specialiseringstabellerne for de foruddefinerede idTypes, men behold en adhoc idType-kolonne i commentId-tabellen.

Bemærk, at selv den hybride tilgang kun kræver 2x pladsen i den denormaliserede tabel; og giver triviel forespørgselsbegrænsning af idType. Integritetsbegrænsningen er imidlertid ikke ligetil, idet den er en FK-begrænsning på en afledt UNION af typetabellerne. Min generelle tilgang er at bruge en trigger på enten hybridtabellen eller en tilsvarende opdaterbar visning til at udbrede opdateringer til den korrekte undertypetabel.

Både den simple tilgang og den mere komplekse subtype tabeltilgang virker; stadig, til de fleste formål gælder KISS, så bare jeg formoder, at du nok bare skal introducere en ID_TYPES-tabel, den relevante FK, og være færdig med den.




  1. Vælg data mellem 2 datoer og gennemsnitlig timeoutput

  2. Hvordan erklærer man et array af rækketype i en PostgreSQL-funktion?

  3. et MYSQL-script til at konvertere kolonnenavnene til små bogstaver

  4. Oracle JDBC:Hvordan ved man, hvilken række der har en unik nøglebegrænsning?