None of this is necessary if you select a durable schema.

Whenever you think you need to "add a field" - add a whole new table and
use joins anywhere you need access to the new field.

You can't "delete" a field, but deleting a field usually means losing
data anyway.

You can't change the nature of a field without changing the domain that
the data exists in. Keeping strict 1NF tables can really help avoid
this.


Your "update procedure" wouldn't be necessary at all.



On Sun, 2005-01-30 at 11:44 +1300, Murray Moffatt wrote:
> I'm creating a shareware program using Visual Basic and SQLite.  I'm using  
> the SQLiteDB wrapper.
> 
> I want to plan how I am going to handle updates to my program that involve  
> modifing the database, and thus I'd like some advice as I'm sure others  
> have faced this problem before.  I need to be able to send out an update  
> to existing users which keeps all of their existing data in tact.  I  
> imagine that most of the updates will involve adding new fields.
> 
> At the moment my plan is to have a Control table in the database that  
> includes a field that holds the version number of the database.  Then when  
> my program starts up it can check this version against its own version and  
> if the database version is lower then it can tell the user that they need  
> to upgrade their database and automatically run an Update program that  
> will be included with all update releases.
> 
> The Update program will have an empty copy of the latest database (i.e.  
> tables all set up but no actual data), and will import all the records  
>  from the old database into the new one.  Then rename the old database  
> (thus keeping a copy in case something goes wrong) and copy the new one in  
> its place.
> 
> One problem I thought of is what happens if a user skips an update and  
> thus is upgrading from, say, version 1 to version 3.  Rather than create a  
> convoluted system where that Update program can convert from any version  
> to any other, I would like to make the Update program as generic as  
> possible, i.e. it reads the old database and matches the fields in it with  
> the fields in the new database and copies that data.  In this way it won't  
> expect to see certain fields in certain versions, instead it just sees a  
> Name field in the old database and copies the data found in that field  
> into the Name field in the new database.  Obviously all new fields will be  
> empty.
> 
> Does this sound like a logical way of handling database updates?  Does  
> anyone have any suggestions for a better method, or possible pitfalls in  
> my idea?
> 
> One assumption I'm making is that if I upgrade the verson of SQLite that  
> is used by my program then I assume that newer versions will always be  
> able to read databases created by older versions.  Is this correct?

Reply via email to