WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Optimera MySQL (https://www.wn.se/forum/showthread.php?t=1047006)

danjel 2011-03-14 13:40

Man kan inte säga att man generellt ska undvika syntetiska primärnycklar.
Jag säger tvärtom , undvik naturliga primärnycklar i 9 fall av 10.
Speciellt viktigt då det är flera kolumner, tänk att göra en många-till-många relation, givet att du har t.ex två PK bestående av 4 kolumner så får du du 8 kolumner i kopplingstabellen jämfört med två kolumner om du kör syntetiska primärnycklar.

Det där med anomalier med syntetiska PK förstår jag inte, man är med det 100% säker på att man inte har dubletter. Och självklart har man foreign key constraints och valideringar av data ändå.

En primärnyckel ska vara unik och inte ha en mening, då denna "mening" kan ändras, personnummer är ett exempel.

Vad gäller prestanda så är joins mellan char avsevärt mycket slöare jämfört med integers. Så pass att det kan orsaka upplevd seghet med mycket data. Och vad gör man då, designar om databasen? Njae....

Adestro 2011-03-14 14:15

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20397671)
Det märks att du inte vet hur relationsdatabaser fungerar. Man garanteras att inga anomalier inträffar när man använder naturliga PK, det har du inte när du använder syntetiska PK. Redundans blir det inte om man använder naturliga PK. Själva nyckeln i sig kan aldrig dubbellagras.

Det där med texterminal förstod jag inte? Jag använder grafiska verktyg att analysera data med.

Vi kan kasta in tillverkare/märke som en VARCHAR i produkttabellen också. Blir mindre kul, ur prestandasynpunkt, när kunder ska kunna filtrera produkter efter färger, storlekar, tillverkare, etc. :)

Clarence 2011-03-14 16:45

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20397661)
Att optimera prestanda är inget självändamål.

Jag skulle påstå att prestandaoptimering alltid är ett självändamål. Oavsett om det är 1 eller 1 miljon användare vill man ha en rapp databas som inte tar onödigt mycket resurser i anspråk. Skalbarhet är den viktigaste relaterade aspekten, men den blir oväsentlig vid för dålig prestanda då lösningen blir för kostsam för att skala upp.

Citat:

När man bygger en databasstruktur i en relationsdatabas så är det viktigaste att man får en inbyggd kvalitetskontroll på informationen man lagrar.
Nej, när man bygger en databasstruktur där en inbyggd kvalitetskontroll i allmänhet är otroligt viktiga aspekt av datahanteringen är kvalitetskontrollen primär. De allra flesta moderna webbapplikationer faller utanför denna kategorin.

Citat:

Då är naturliga primärnycklar en naturlig del av det arbetet. Främmande nycklar som då länkar till primärnycklar är en annan del. Atomära egenskaper ytterligare en. Att följa normalformernas definitioner ytterligare en.
Och om du sedan tittar på uppstickarna som växer snabbast och ligger i framkant i utvecklingen så har de en helt annan uppfattning. De-normalisering, eventual consitency, begränsning av joins, uteslutande av foreign keys osv är deras mantra. Sanningen ligger väl snarare i att varje applikation har olika aspekter som väger olika tungt. Att påstå att man måste följa ACID för att använda en relationsdatabas eller säga att data endast får sparas i 3NF är för mig ungefär lika sant som de som att man ska använda moderna graf-databaser till precis allt.

Citat:

Att använda syntetsiska primärnycklar ska manundvika och endast använda i de fall när det inte finns en naturlig primärnyckel eller där en naturlig primärnyckel kommer att bestå av orimligt många kolumner (typ; >7 kolumner).

Den "prestandavinst" man vinner på att använda syntetiska PK är oftast så marginell att den inte är värd att beakta, i de flesta fall. Man förlorar så otroligt mycket mer vad gäller den inbyggda kvalitetskontrollen av information när man gör det.
Din tanke där är lika mycket på utdöende som den är på ingång skulle jag vilja påstå. Det blir allt vanligare med system där andra primärnycklar än ett auto increment används. Men vad som blir ovanligare är system där man försöker hitta en unik identifierare som redan finns i varje rad. Då blir man nämligen tvungen att definiera sin data mycket hårdare än vad man kan i de flesta agila miljöer eller mer än vad man vill i de flesta miljöer med användargenerat innehåll. Dessutom är det som redan påstått rent kasst ur prestandasynpunkt. Den prestandavinst som görs på de flesta primary key lookups är högst väsentlig, både med och utan joins och när det gäller innodb (vi pratar trots allt mysql här) är den även högst relevant för alla användning av sekundär-index.

Citat:

Använder man naturliga PK så kan man som människa utföra okulärbesiktning av data på ett enklare sätt än med syntetiska PK. Du kan m a o direkt se om set står NOK i en kolumn där du för väntar dig att det ska stå SEK, men om det står 4 i stället för 7 så finns det inget naturligt sätt för en människa att avgöra om informationen är korrekt eller inte. Man måste ha mycket mer komplexa sätt att kontrollera om informationen är korrekt och det innebär att det är lättare att man får strukturella fel i sin databas och sina applikationer.
Ja, jag skulle påstå att det är den enskilt största nyttan med naturliga PK, men för mig är den verkligen sekundär. Det är väldigt sällan man manuellt går igenom databasen för de allra flesta webbapplikationer och om man då måste skriva en join-sats för en kolumn eller två för att kontrollera finner jag inte så intressant.


Alla tider är GMT +2. Klockan är nu 01:03.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson