We use UUID's for all our applications as the primary key.
Our main driver behind this is syndication of data between separate DB's. I.e you have 2 separate databases (dev and production) and want to merge some data. If both databases have had data added independently of the other then it is possible the same integer ID will exists is both DB's making it very difficult for merge replication. This also means we also have database independence and do not have to rely on any DB vendors specific features. With regards to speed we have run some SQL trace tests and found that for tables with less than 10,000 records it's not an issue. It also helps If you index the uuid field. Hope this helps. Grant Straker Straker Next Generation Content Management www.straker.com.au -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] Sent: Wednesday, 22 January 2003 1:20 p.m. To: CFAussie Mailing List Subject: [cfaussie] Re: UUID vs Integer with Primary keys.. OK, I am posting the scripts for the SPs. You should only look at the process of the SPs, to really use them, you will have to create your own tables to work with. And modify the column and table names in the SPs... I was going to post the whole structure of the db as well, but it will take me to long to modify and adjust for posting. If anyone sees any faults in this script or knows a better way of doing it, I would be happy to hear about it. It took me a long time to get these SPs to create a fast and efficient hierachy.. While we are talking about SPs, anyone got any good solutions to client side cursors? i.e. working with a cursor in the db is fine and dandy, but as soon as you transfer the data to the client (web) it looses it's cursor features. I was working on a cursor that doesn't loose it's state and maintain the session with the client, but it ended up using to many temp tables... I hope I'm not off topic here, I know its a CF list, but after all I am a CF programmer ;-)) Stored Proc 1 --------------------------------------------- SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO /****** Object: Stored Procedure dbo.spTree Script Date: 22/01/2003 9:51:54 AM Author: Taco Fleur ******/ CREATE Procedure spTree ( @parentID INTEGER ) AS SET NOCOUNT ON DECLARE @table VARCHAR(64), @sql NVARCHAR(1024), @position INTEGER SET @position = 0 SET @table = '##spTree' + CONVERT( VARCHAR(4), @@SPID ) SET @sql = 'CREATE TABLE ' + @table +' (' +' position INTEGER, ' +' pkReplyID INTEGER, ' +' fkParentID INTEGER, ' +' fkThreadType TINYINT, ' +' replyBody VARCHAR(8000), ' +' approved BIT, ' +' dateStamp SMALLDATETIME ' +')' EXECUTE sp_executesql @sql -- Get all immediate replies to the thread -- threadType = 1 AND fkParentID = threadID EXECUTE spTreeBuild '1', @parentID, @table, @position -- The tree is now ready in the temp table. -- Construct SQL statement for selecting from table. SET @sql = 'SELECT * FROM ' + @table -- Execute SQL to select. EXECUTE sp_executesql @sql -- Construct SQL statement for dropping the temp table. SET @sql = 'DROP TABLE ' + @table -- Execute SQL to drop the table. EXECUTE sp_executesql @sql RETURN GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO --------------------------------------------- Stored Proc 2 --------------------------------------------- /****** Object: Stored Procedure dbo.spTreeBuild Script Date: 22/01/2003 9:52:11 AM ******/ CREATE Procedure spTreeBuild ( @threadType TINYINT, @parentID INTEGER, @table VARCHAR(64), @position INTEGER ) AS SET NOCOUNT ON DECLARE @replyID INTEGER, @replyBody VARCHAR(8000), @approved BIT, @dateStamp SMALLDATETIME DECLARE @sql NVARCHAR(1024) DECLARE @children CURSOR SET @position = @position + 1 EXECUTE spTreeChild @parentID, @threadType, @children OUTPUT, @position -- Loop to parse the list of activities obtained in cursor. WHILE( 1 = 1 ) BEGIN -- Fetch the details for next activity. FETCH NEXT FROM @children INTO @position, @replyID, @parentID, @threadType, @replyBody, @approved, @dateStamp -- Check if fetch is valid, i.e., there are more records. IF @@FETCH_STATUS = -1 BREAK SET @sql = 'INSERT INTO ' + @table + ' VALUES(' + CAST(@position AS VARCHAR(10)) + ',' + CAST(@replyID AS VARCHAR(10)) + ',' + CAST(@parentID AS VARCHAR(10)) + ',' + CAST(@threadType AS VARCHAR(10)) + ',' + '''' + @replyBody + ''',' + CAST(@approved AS VARCHAR(10)) + ',' + '''' + CAST(@dateStamp AS VARCHAR(20)) + ''')' EXECUTE sp_executesql @sql EXECUTE spTreeBuild '2', @replyID, @table, @position END -- Close the cursor. CLOSE @children -- Deallocate the cursor. DEALLOCATE @children RETURN GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO --------------------------------------------- Stored Proc 3 --------------------------------------------- /****** Object: Stored Procedure dbo.spTreeChild Script Date: 22/01/2003 9:52:24 AM ******/ CREATE Procedure spTreeChild ( @parentID INTEGER, @threadType TINYINT, @child CURSOR VARYING OUTPUT, @position INTEGER ) AS SET NOCOUNT ON SET @child = CURSOR FOR SELECT @position AS position, pkReplyID, fkParentID, fkThreadType, replyBody, approved, dateStamp FROM tblForumReply WHERE (fkParentID = @parentID) AND (fkThreadType = @threadType) ORDER BY datestamp OPEN @child RETURN GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO --------------------------------------------- I would appreciate it if these stored procs won't go any further than this list, when time comes I'd like to publish it myself ;-)) Taco Fleur > This email is to be read subject to the disclaimer below. > > Taco, > > The one table approach you describe is something we use too, so those > stored procedures sound interesting to me. Could you please send me a > copy of them? > > Cheers > > Vik > --------------------- > Viktor Radnai > Web Developer, National E-Commerce, Ernst & Young > Direct: +61 2 9248 4361 > > > > > [EMAIL PROTECTED] > Sent by: To: "CFAussie Mailing List" <[EMAIL PROTECTED]> > [EMAIL PROTECTED] cc: > mon.com.au Subject: [cfaussie] Re: UUID vs Integer with Primary keys.. > > 22/01/2003 10:06 AM > Please respond to "CFAussie > Mailing List" > > > > > > Scott, > > I'm not sure why you would want to spread your data across 3 tables. > > I always use the following db structure for a Tree Hierachy. > > pkWhateverID [integer pk identity] / fkParentID [integer] / textColumn > [varchar(X)] > > I use 3 very small and simple stored procedures that create a temp > table and create the sorted output I need to display. I'd be happy to > send you a copy of these 3 stored procedures if it would be of any > help to you? > > The disadvantage I see is that with the structure you got now you can > not go down the Tree hierachy further than the sibling. With the above > structure you can go down the hierachy as far as you need to. > > I would say the negative effect of using UUID would be: > - It takes longer to create than an incrementing integer > - I believe there is still a 0.01 % change that you will run into a > duplicate > - It takes more space to store a UUID instead of an integer > > Hey, maybe I am way of here and don't exactly understand what needs to > be done... In anycase if I am on the right track let me know if I can > help.. > > Taco Fleur > > PS. sounds like you got the perfect job being able to work on thsoe > sites. > > > Sorry to ask probably a question thats had a debate before, but.. i > > will > so shutup and read. :D > > > > Whats the negative sideeffects of using UUID instead of Integer > (autonumber) for primary keys in a table. The reason i bring this up, > as I always use a parent-child-sibling-infant type relationship > amongst various tables, one example off the top of my head was a > awhile back where i had 3 tables that basically provide: > > > > - Category (parent table) > > - Category (parent table) > > ---- File (child table) > > ---- File (child table) > > ------- file versions (sibling table) > > ------- file versions (sibling table) > > ------- file versions (sibling table) > > ---- File (child table) > > ---- File (child table) > > ------- file versions (sibling table) > > ------- file versions (sibling table) > > ------- file versions (sibling table) > > - Category (parent table) > > ---- File (child table) > > ---- File (child table) > > ---- File (child table) > > ---- File (child table) > > - Category (parent table) > > > > This situation called for the ability to not only associate 3 > > different > tables into a heircahy based dataset, but it also called for i think > 3-4 other tables that provided other pieces of information per level, > and in doing this i was forced to use a big meaty looking SQL SP, that > made use of both UNIONs and Views, which worked great. > > > > I did find that if i simply relied on the Autonumber system, the > > heirachy > would be out of sync, as in the joining field for the child had the > same value as the parent pk, but having said that, the child pks also > had the same value and so a child brach would mistakenly associate its > children under another child? > > > > ie: > > parentID = 2 > > > > childID = 1 > > childParent = 2 > > > > childID = 2 > > childParent = 2 > > > > childID = 3 > > childParent = 2 > > > > even though the childParent = 2, i did find that child referred to > childID = 2 as its parent? > > > > I did manage to find away around this so i didn't have to basically > redesign the entire db, but i'm about to embark on a bigger project > (probably the biggest i have undertaken yet) and i so want this to be > a finely tuned effecient running machine, and having remembering this > scenario, i felt a bit nervous with simply utilising an "autonumbered" > system or even a seperate table which has a running pool of numbers > that you take from. > > > > Atleast with UUID i know that no matter what no other rowID > > through-out > the entire database will have the same value? > > > > Your thoughts would be appreciated. > > > > Scott Barnes > > eCommerce > > Tourism Queensland / Sunlover Holidays [EMAIL PROTECTED] > > > > www.queenslandtravel.com > > www.sunloverholidays.com > > --- > You are currently subscribed to cfaussie as: > [EMAIL PROTECTED] To unsubscribe send a blank email to > [EMAIL PROTECTED] > > MX Downunder AsiaPac DevCon - http://mxdu.com/ > > > > > -------------------- > NOTICE - This communication contains information which is confidential > and the copyright of Ernst & Young or a third party. > > If you are not the intended recipient of this communication please > delete and destroy all copies and telephone Ernst & Young on 1800 655 > 717 immediately. If you are the intended recipient of this > communication you should not copy, disclose or distribute this > communication without the authority of Ernst & Young. > > Any views expressed in this Communication are those of the individual > sender, except where the sender specifically states them to be the > views of Ernst & Young. > > Except as required at law, Ernst & Young does not represent, warrant > and/or guarantee that the integrity of this communication has been > maintained nor that the communication is free of errors, virus, > interception or interference. > > Liability limited by the Accountants Scheme, approved under the > Professional Standards Act 1994 (NSW) > -------------------- > > > > > --- > You are currently subscribed to cfaussie as: [EMAIL PROTECTED] To > unsubscribe send a blank email to > [EMAIL PROTECTED] > > MX Downunder AsiaPac DevCon - http://mxdu.com/ --- You are currently subscribed to cfaussie as: [EMAIL PROTECTED] To unsubscribe send a blank email to [EMAIL PROTECTED] MX Downunder AsiaPac DevCon - http://mxdu.com/ --- You are currently subscribed to cfaussie as: [email protected] To unsubscribe send a blank email to [EMAIL PROTECTED] MX Downunder AsiaPac DevCon - http://mxdu.com/
