Data i .Net på olika sätt
I DotnetRocks #553 berättade Chris Sells att han skrivit om koden för att hantera data i Nerddinner med de flesta sätt att komma åt data som finns i .Net.
I ett svagt ögonblick lovade jag någon på jobbet att skriva ‘HelloWorld’ med Microsofts olika metoder för dataaccess så det var klockrent att någon med koll på läget redan gjort det.
Jag lyckades inte googla mig fram till koden så jag epostade Chris och frågade om den fanns tillgänglig.
Han svarade ganska snabbt och meddelade att koden finns här: http://msdn.microsoft.com/en-us/data/ff707264.aspx
Varför ska man inte använda Access till webben?
Microsoft Access är gjort för små applikationer som bör köras inom/på en dator.
Redan innan internet och webben exploderade var det vanligt att man använde Microsoft Access för att bygga applikationer som skulle användas av flera personer samtidigt. Det tydliggjordes ganska snart att Access inte riktigt hängde med i svängarna när det blev mer än ungefär fem användare. Lite på skämt brukade vi säga att det blev för många redan vid två användare. Riktigt så illa är det inte, men ibland kan man undra… Jag misstänker i och för sig att nätverk och operativsystem hos de inblandade kunderna inte alltid var helt friska. (och 10Mbit var snabbt på den tiden)
Anledningen till att Access får problem i en nätverksmiljö är att databasen är en stor fil som hanteras av den dator som kör klientprogrammet, eller webbservern i fallet med en webbapplikation. Den hanteras alltså inte av en databasserver som MySql eller MS-SQL. När man har en ordentlig databasserver är den ett program som lyssnar på databasfrågor, letar reda på svaret i den stora filen och skickar sedan tillbaka svaret. Om man använder Access måste programmet som ställer frågan själv hämta hela, eller delar av, den stora filen över nätverket, leta efter data och sedan göra något med det. Om man då har flera användare utspridda över ett nätverk så öppnas databasfilen flera gånger och skickas runt till många på nätverket. Dessutom måste databasaktiviteter som förändrar databasen köas, eftersom flera användare inte kan skriva i samma fil på en gång.
Hos många ISP:er (Internet Service Provider) som erbjuder webbhosting på Windows-servrar kan man använda Access som databas. Man kommer då inte ha flera användare mot databasen, men många processer från samma användare, vilket ger nästan samma problem som med flera användare på ett nätverk.
Vad är alternativen?
Om du bygger en applikation med en central databas som ska användas inom ditt företags nätverk, oavsett om det är en webbapplikation eller skrivbordsapplikation, kan du använda Microsoft SQL Server Express. Det är en version av Microsofts flaggskepp med lite begränsningar. De två stora fördelarna med denna är att det är lätt att flytta upp till en större version av SQL Server samt att alla verktyg fungerar precis som med de stora versionerna. Det gör att man kan använda alla gratisverktyg från Microsoft utan problem. Verktyg som Netbeans, Eclipse och så vidare brukar också ha bra stöd för MS SQL Server.
Om du bygger en webbapplikation som ska ligga på ett webbhotell brukar MySql vara det bästa alternativet. MySql ägs nu för tiden av Oracle, men är fortfarande gratis och har öppen källkod. MySql finns nästan alltid installerat hos ISP:erna. Om du använder något programmeringsspråk som inte kommer från Microsoft brukar den exempelkod man hittar på nätet vara till MySql.
Både MySql och MS SQL Express går bra att installera på din egen utvecklingsdator om du vill testköra kod utan att koppla upp dig mot din ISP.
Det finns en massa verktyg för att konvertera Access till MySql. För att uppgradera Access till MS Sql Server finns det en Upsizing Wizard.
…så gör slag i saken- ta bort Access från dina webbapplikationer idag!
Vad är null?
Null betyder att det inte finns något definierat värde.
När man skapar en kolumn i en tabell i sin databas anger man, förutom datatyp, huruvida kolumnen får vara null eller inte.
Ett fält på en rad kommer att vara null om man inte talat om att det ska vara något annat. Antingen kan man ange ett standardvärde när man skapar tabellen, eller så får man ange ett värde när man lägger till en ny rad, eller så kan man uppdatera raden senare. För att lägga till och ändra rader i en tabell använder man SQL-kommandona INSERT och UPDATE som jag kommer skriva om senare.
När ett fält är null kommer alla jämförelser med det fältet också att bli null. Det betyder att null slår undan fötterna på all booleansk algebra:
- Sant OCH NULL är NULL
- Falskt OCH NULL är NULL
osv…
Vanlig matematik fungerar inte heller eftersom 4 + NULL = NULL
En rolig effekt av detta är att om man jämför två värden som båda är null så är resultatet inte Sant, det är null.
För att handskas med fält som kan innehålla null finns det ett par olika varianter. I både T-SQL (Microsoft SQL Server) och MySql kan man använda COALESCE() eller ISNULL().
ISNULL(): returnerar ett förutbestämt värde om det man egentligen letar efter är null. SELECT ISNULL(null, 1) kommer att returnera 1
COALESCE(): returnerar det första värdet i en lista som inte är null: SELECT COALESCE(a, b, c, d …)
I MySql finns det dessutom en nullsäker jämförelseoperator: a <=> b Den returnerar 1 om båda värdena är null och 0 om det ena värdet är null.
När man ska räkna rader i en tabell kan man också behöva tänka på hur null behandlas. SELECT COUNT(*) FROM TabellNamn kommer att returnera antalet rader i tabellen, men SELECT COUNT(Fältnamn) FROM TabellNamn kommer bara returnera antalet rader i tabellen där ‘Fältnamn’ inte är null.
Ganska ofta ser man att den som designat databasen slentrianmässigt har satt ett standardvärde på en kolumn, eller angivit att kolumnen inte får vara null. När man gör så tvingar man alla som använder databasen att hitta på ‘magiska’ värden när de egentligen inte har något vettigt värde att använda.
Anta att vi har en tabell för att lagra fordon och i den tabellen har vi en kolumn som anger respektive fordons bränsletyp. Vad ska man då ange för bränsletyp för en cykel? Om kolumnen tillåter null är svaret enkelt; eftersom det inte finns någon motor i en vanlig cykel finns det heller ingen bränsletyp att ange. Sålunda sätter man kolumnen till null på alla rader som representerar cyklar. Om databasdesignern i stället sagt att man inte får ha null i kolumnen för bränsletyp måste man hitta på ett värde. Om fältet är ett heltal kan man knaske sätta det till 0 för att representera ‘ingen’. Om man dessutom har alla giltiga bränsletyper i en separat tabell som man förväntas referera till för att hitta benämningar på olika språk måste man lägga till låtsasposter i den referarade tabellen för att databasservern ska kunna upprätthålla informationens dataintegritet.
Null är en bra konstruktion i databaser som många ‘vanliga’ programmeringsspråk saknar, men man måste hålla koll på var och hur det används.
Vad är en datatyp?
När man sparat information om till exempel en person i en tabell delar man upp informationen i kolumner. För information om en person kan de olika kolumnerna till exempel vara; Namn, Födelseår, Telefonnummer och Kön. För att databashanteraren på bästa sätt ska kunna lagra informationen talar man om vilken datatyp respektive kolumn har.
Datatypen talar om huruvida kolumnen innehåller ett heltal, en text, ett datum och så vidare. Alla databashanterare erbjuder olika datatyper och har ibland olika namn på samma datatyper.
Nästan alla datatyper är olika varianter på heltal, text, datum, boolean och decimaltal. Utöver dessa finns till exempel datatyper för tider, identifikation, geografi och geometri. Av dessa är nog boolean den som man inte instinktivt vet vad det är. Det är ett värde som är antingen sant eller falskt.
I exemplet med persontabellen ovan skulle namnet vara en text och födelseår ett heltal. För telefonnummer och kön blir det lite knepigare att bombsäkert säga vilka datatyper det ska vara utan att veta något mer om hur de ska användas.
Man skulle kunna spara telefonnummer som en heltal om man struntar i var det ska delas i riktnummer och lokalnummer. Heltalen lagrar inte några inledande nollor eller blanksteg så det kan bli problem om man vill sortera telefonnumren. Ett annat alternativ är att spara telefonnumret som en text med bindestreck mellan nummerdelarna. Det finns säkert någon databas som har en egen datatyp för att representera telefonnummer. Det finns ett alternativ som utnyttjar relationer i databasen. Man kan lagra alla telefonnummer i en egen tabell och låta dem referera tillbaka till persontabellen. På så sätt kan man hantera ett en person har flera telefonnummer och man kan strunta i hur ett telefonnummer ska representeras när man funderar på persontabellen.
Kön kan också representeras på lite olika sätt. Man kan ha en boolean som talar om huruvida personen är man (sant=man, falskt=kvinna). Man skulle kunna ha en liten text där det står ‘man’ eller ‘kvinna’, fast då blir det svårt att översätta applikationen som använder informationen till flera språk. Texthantering är dessutom betydligt långsammare än booleansk algebra. Du kan säkert komma på flera andra sätt att representera kön i en tabell.
Datatyper används alltså för att tala om för databashanteraren vilka begränsningar som gäller för varje liten del av informationen som ska behandlas.
Vad är en relationsdatabas?
Tidigare beskrev jag generellt vad en databas är.
I en relationsdatabas sparar man listor med information. Dessa listor kallas tabeller och kan referera till varandra på lite olika sätt. Referenserna mellan tabellerna kallas relationer, därav namnet; relationsdatabaser.
Tabeller, eller snarare rader i tabeller, kan referera till varandra på tre olika sätt:
- En till många
- Många till många
- En till en
Det databashanteraren hjälper till med, om man definierat tabellerna ordentligt, är att säkerställa att dessa relationer efterlevs.
En till många
Det här är den absolut vanligaste relationen. En rad i en tabell refereras av flera rader i en annan tabell.
Om man till exempel har en tabell med personer och en tabell med telefonnummer så kan en person ha flera telefonnummer, men ett telefonnummer hör bara till en person.
Många till många
Det här är en relation som de flesta databashanterare inte kan hantera ordentligt så man får ofta fuska till den.
Om man till exempel har en lista med elever och en lista med kurser så kan en elev gå på flera kurser och en kurs kan ha flera elever. För att få till det så får man lägga till en tredje tabell som innehåller en rad per elev och kurs. Sedan kan man sätta upp två stycken ‘en till många’-relationer. En elev finns en gång i elevtabellen och flera gånger i Elev/Kurs-tabellen och en kurs finns en gång i kurstabellen samt flera gånger i Elev/Kurs-tabellen.
En till en
Denna relation förklarar nog sig själv om man läst de föregående, men den är svårast att förklara nyttan med för någon som inte själv blivit tvungen att utnyttja den. Relationen går ut på att en rad i en tabell har en relation till en unik rad i en annan tabell.
Man skulle till exempel kunna tänka sig att man har en tabell med sålda bilar och en annan tabell med de sålda bilarnas motorer. Varje bil har exakt en motor och varje motor tillhör exakt en bil.
En stor del av arbetet med att designa en databas är att komma på hur alla delar av den information man ska behandla hänger ihop. I princip kan man säga att det är det som kallas normalisering, vilket jag kommer skriva om senare.
Lite mindre tankemöda,men inte mindre viktig, är att föreslå för databashanteraren hur den ska lagra all information. För att reda ut det kommer nästa artikel att förklara vad datatyper är.
