Oplopende GUID

Gisteravond ben ik begonnen met het maken van de database voor m’n nieuwe prive project.

In m’n ontwerp maak ik gebruik van GUID’s in plaats van de reguliere ‘oplopende unieke teller’ welke vaak als primary key wordt gebruikt.

Het voordeel van een GUID, is dat deze altijd uniek is. Een systeem zal nooit dezelfde GUID maken.

Nadeel van een GUID is wel dat ze volgens mij meer bytes in beslag nemen als een integer. Nog een nadeel is dat ze voorheen met de functie newid() geen logica hadden. Het systeem maakte wel altijd een nieuwe GUID, maar er werd niet gegarandeerd dat deze op- of aflopend zou zijn.

Nu is er een nieuwe functie in SQL 2005 geintroduceerd, namelijk de newsequentialid(). Zoals de naam al doet vermoeden maakt deze een nieuwe GUID, en deze is altijd hoger als de vorige. Je hebt dus een oplopende primary key. Dat is handig met sorteren en voor de indexes, aangezien er dan sneller kan worden gezocht naar nieuwe records en dergelijke.

Probleem met de functie newsequentialid() is dat je deze niet kunt gebruiken met het designen van een tabel in Management Studio van SQL 2005. Je krijgt dan een validatie error bij het gebruik van deze functie.

De bug is bekend mij Microsoft, maar gaan het misschien verhelpen in de volgende release. Ik weet niet of ik hier nou blij mee moet zijn of niet. Waarschijnlijk bedoelen ze dus SQL Server 2008 en niet de volgende hotfix, waardoor alle blije SQL 2005 ontwikkelaars met de gebakken peren zitten.

Gelukkig kun je nog wel via query scripts gebruik maken van de functie newsequentialid(). Gisteren heb ik dus al mijn tabellen via een script gegenereerd met het GUID veld. De rest doe ik wel via de design mode in management studio.

Nog iets dat lijkt te werken. Je kunt de foutmelding ook cancellen en doorwerken. Bij het opslaan van de tabel krijg je dan ook een foutmelding. Deze kun je dan met Yes beantwoorden. De tabel is dan opgeslagen. Uit een miniscule test bleek dat de functie newsequentialid() dan ook werkt. Ik heb het met 2 records getest. Dit is niet echt representatief, aangezien het ook toeval kon zijn dat de 2e GUID hoger was als de eerste.

Deze methode kan ik dan ook niet aanraden. Het beste is om gewoon via scripts de tabellen met newsequentialid() aan te maken. Dit werkt sowieso goed.

Uiteraard krijg je nog wel foutmeldingen wanneer je weer in design mode van de tabel springt, maar in ieder geval werkt de funtie goed op de tabel.
Toch wel leuk zo’n avondje SQL’en. Zo leer je nog eens wat.

Morgenavond voor het stappen de rest van de database maar af maken, inclusief constraints, foreign keys, primary keys en dergelijke.


Share