Create and Update Database Schema

Introduction

When developing an application using DDD one starts by trying to define a model of the domain for/in which the application should be used. At the same time you try to establish the so called ubiquitous language. At some point you might need to store and or retrieve data into or from a data source. Very often this data source is a relational database. But it's not necessarily always the case. It could as well be a web service or a XML document. That leads me to the notion that "the database is just an implementation detail of the application". Or if I turn this sentence a little bit around "...it should not be the database (-schema) that determines the design of an application but rather should the database schema be a natural outcome of the domain model...". I know, this is NOT what a DBA likes to hear. But trust me I have developed many applications in the past where the first thing that was designed of the application was the entity relationship diagram (ERD)... I have also implemented quite a lot of stored procedures on Oracle and SQL server in the past. So I know both sides of the argument.

Assuming that the database schema should be an implementation detail of the overall application it would be great if the schema could be somehow auto-generated from the domain model. As you might expect, when using NHibernate as the ORM tool this is possible. We have to distinguish between the two possibilities

  • (re-) create a new schema from scratch
  • updating an existing schema

Create Schema

The model

To start we define a very basic model

image

The Mappings

In our data layer we define the two mapping files Product.hbm.xml and Category.hbm.xml. The former's content is

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Domain"
                   assembly="Domain">
  <class name="Product">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="Name"/>
    <many-to-one name="Category" class="Category"/>
  </class>
</hibernate-mapping>

and the latter's content is

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Domain"
                   assembly="Domain">
  <class name="Category">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="Name"/>
  </class>
</hibernate-mapping>

Note that we have defined only the absolute minimum needed and rely heavily on the (meaningful) defaults provided by NHibernate.

Tests

To analyze the database schema creation script generated by NHibernate we write the following test

[TestFixture]
public class CreateSchema_Fixture
{
    private Configuration _cfg;
 
    [SetUp]
    public void SetupContext()
    {
        _cfg = new Configuration();
        _cfg.Configure();
        _cfg.AddAssembly(Assembly.LoadFrom("DataLayer.dll"));
    }
 
    [Test]
    public void Create_a_database_schema_creation_script()
    {
        var export = new SchemaExport(_cfg);
        var sb = new StringBuilder();
        TextWriter output = new StringWriter(sb);
        export.Execute(true, false, false, false, null, output);
    }
}

Note that the configuration file hibernate.cfg.xml has the following content in our case

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=(local);Database=NHibernateFAQ;Integrated Security=SSPI;</property>
    
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

That is, we are using a SQL Server 2005 database called NHibernateFAQ. It is not necessary to have SQL Server 2005 installed though since we are only generating (and analyzing) the scripts generated by NHibernate and not accessing the database itself!

The output generated by the above test is similar to this

if exists (select 1 from sys.objects 
           where object_id = OBJECT_ID(N'[FK1F94D86A9F364CC5]') 
           AND parent_object_id = OBJECT_ID('Product'))
    alter table Product  drop constraint FK1F94D86A9F364CC5
 
if exists (select * from dbo.sysobjects 
           where id = object_id(N'Product') 
           and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    drop table Product
if exists (select * from dbo.sysobjects 
           where id = object_id(N'Category') 
           and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    drop table Category
 
create table Product (Id UNIQUEIDENTIFIER not null, 
                      Name NVARCHAR(255) null, 
                      Category UNIQUEIDENTIFIER null, 
                      primary key (Id))
create table Category (Id UNIQUEIDENTIFIER not null, 
                       Name NVARCHAR(255) null, 
                       primary key (Id))
 
alter table Product add constraint FK1F94D86A9F364CC5 
foreign key (Category) references Category

That's really wonderful for a quick shot!

The default for a column is that it is nullable and the default type and length for a string type field is NVARCHAR(255).

Mandatory columns and maximal length of column

But there are a few details that we might want to improve. First we want to make the Name columns mandatory (NOT NULL). Nothing easier than that; just add an attribute not-null="true" to the mapping files where appropriate. Also we want to limit the length of the Name column to given amount, e.g. 50 characters. Just add a length="50" to the appropriate property of the mapping files. The create table part of the schema creation script is then

create table Product (Id UNIQUEIDENTIFIER not null, 
                      Name NVARCHAR(50) not null, 
                      Category UNIQUEIDENTIFIER null, 
                      primary key (Id))
 
create table Category (Id UNIQUEIDENTIFIER not null, 
                       Name NVARCHAR(20) not null, 
                       primary key (Id))

Foreign Keys

There is still a detail in the script that might disturb you. It's the name of the foreign key constraint between the Product and the Category tables. If we want to choose a name we can use the foreign-key attribute on the many-to-one node of the mapping file, e.g.

<many-to-one name="Category" class="Category" foreign-key="fk_Product_Category"/>

now the corresponding snippet of the script is

if exists (select 1 from sys.objects 
           where object_id = OBJECT_ID(N'[fk_Product_Category]') 
           AND parent_object_id = OBJECT_ID('Product'))
    alter table Product  drop constraint fk_Product_Category
...
alter table Product add constraint fk_Product_Category 
foreign key (Category) references Category

Unique Constraints

If we want to guarantee that the Name property of the Category class is unique we can do this by either using business logic to enforce this requirement or define a unique constraint on the database. Let's have a look at the latter. Just add the attribute unique="true" to the mapping of the Name property in the mapping file for the Category class. That is

<property name="Name" not-null="true" length="20" unique="true"/>

and the script generated is this

create table Category (
    Id UNIQUEIDENTIFIER not null, 
    Name NVARCHAR(20) not null unique, 
    primary key (Id)
)

If you want to define a unique constraint which spans multiple columns then you have to resort to the attribute unique-key. Let's assume we have a Person class like

public class Person
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

and we want to define a unique constraint on the combination of the FirstName and LastName columns then our mapping file looks like this

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Domain"
                   assembly="Domain">
  <class name="Person">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="FirstName" not-null="true" length="50" unique-key="uk_Person_Name"/>
    <property name="LastName" not-null="true" length="50" unique-key="uk_Person_Name"/>
  </class>
</hibernate-mapping>
Note that the name you choose for the unique-key is not important (here "uk_Person_Name"). Just use the same name for all columns that make up for a unique constraint. The create table script generated by NHibernate is then
create table Person (
    Id UNIQUEIDENTIFIER not null, 
    FirstName NVARCHAR(50) not null, 
    LastName NVARCHAR(50) not null, 
    primary key (Id),
    unique (FirstName, LastName)
)

Indices

We might also want to tune our database schema and define some indices. Often we might search for a product by its name and thus the Name column might be a good candidate for an index. How can we do this. Well it's again very easy. Just add the attribute index to the right property tag in the product mapping file and provide a name for the index. That is

<property name="Name" not-null="true" length="50" index="idx_Product_Name"/>

now our create script will look like this (note the second last statement where the index is created)

create table Category (Id UNIQUEIDENTIFIER not null, ...)
create table Product (Id UNIQUEIDENTIFIER not null, ...)
create index idx_Product_Name on Product (Name)
alter table Product add constraint fk_Product_Category ...

Check Constraints

We can also define some check constraints on our columns in the database. Let's assume our product has a UnitsOnStock property which must be greater or equal than zero. To define this constraint on the database column we can define the mapping of UnitsOnStock as follows

<property name="UnitsOnStock" not-null="true" >
  <column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>

Note that there is no check attribute defined for the property tag. Thus we have to use the child tag column for this purpose. The create table script is then

create table Product (
    Id UNIQUEIDENTIFIER not null, 
    Name NVARCHAR(50) not null, 
    UnitsOnStock INT null check( UnitsOnStock >= 0) , 
    Category UNIQUEIDENTIFIER not null, 
    primary key (Id)
)

Update Schema

Once we have an existing database schema which we cannot re-create from scratch (because we might already have a first version of our application in production with productive data...) we need another technique. Fortunately NHibernate provides us the possibility to update an existing schema, that is NHibernate creates an update script which can the be applied to the database.

As usual we want to define a unit test for this situation. In the setup for the unit test I'll predefine a first version of my database schema. This time we need to have a database installed on the system (in our case SQL Server 2005) since this first version of the schema is generated in the database otherwise update schema will not work.

So let's have a look at the setup

[TestFixture]
public class UpdateSchema_Fixture
{
    private Configuration _cfg;
 
    public const string product_xml =
        "<?xml version='1.0' encoding='utf-8' ?>"+
        "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'"+
        "                   namespace='Domain'"+
        "                   assembly='Domain'>"+
        "  <class name='Product'>"+
        "    <id name='Id'>"+
        "      <generator class='guid'/>"+
        "    </id>"+
        "    <property name='Name' not-null='true' length='20'/>" +
        "  </class>"+
        "</hibernate-mapping>";
    public const string category_xml = 
        "<?xml version='1.0' encoding='utf-8' ?>"+
        "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'"+
        "                   namespace='Domain'"+
        "                   assembly='Domain'>"+
        "  <class name='Category'>"+
        "    <id name='Id'>"+
        "      <generator class='guid'/>"+
        "    </id>"+
        "  </class>"+
        "</hibernate-mapping>";
 
    [SetUp]
    public void SetupContext()
    {
        // Setup "old" database schema
        _cfg = new Configuration();
        _cfg.Configure();
        _cfg.AddXml(product_xml);
        _cfg.AddXml(category_xml);
        var export = new SchemaExport(_cfg);
        export.Execute(false, true, false, false);
    }
}

I define 2 strings containing the (first version of the) mapping files for the Category and the Product class. In the SetupContext method I create a configuration object and feed it with these two mapping XML fragments. I then export this schema to the database by creating an instance of the SchemaExport class and calling the Execute method.

Note that the Category mapping fragment does not contain a mapping for the Name column and the Product mapping fragment does not contain a mapping for the relation to the Category class as well as no definition of the UnitsInStock column.

Now I want to test the UpdateSchema class and thus implement the following test

[Test]
public void Update_an_existing_database_schema()
{
    _cfg = new Configuration();
    _cfg.Configure();
    _cfg.AddAssembly(Assembly.LoadFrom("DataLayer.dll"));
    var update = new SchemaUpdate(_cfg);
    update.Execute(true, false);
}

The update script generated by NHibernate is

alter table Category add Name NVARCHAR(20) unique
alter table Product add UnitsOnStock INT check(UnitsOnStock >= 0) 
alter table Product add Category UNIQUEIDENTIFIER
alter table Product add constraint 
fk_Product_Category foreign key (Category) references Category

As expected I only get alter statements for existing tables and create statements for the elements missing so far.

Code

You can find the code here. Download it with a SVN client like TortoiseSVN. It's a VS 2008 project.

Summary

When developing a application using DDD the database is often considered an "implementation detail". NHibernate provides us tools to auto-generate create and alter scripts for the database schema from the domain model. I have shown you, by using a simple domain model how to create a schema from scratch and how to alter a pre-existing database schema. I have also discussed various optimization techniques used when creating database schemas as there are unique constraints, indices and check constraints.

Enjoy

Blog Signature Gabriel .

Print | posted on Monday, April 28, 2008 9:52 AM

Comments on this post

# re: Create and Update Database Schema

Requesting Gravatar...
I am having problems getting NHibernate to create the PERSISTED columns:

CREATE TABLE [dbo].[Resource](
[Resource_Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](1000) NOT NULL,
[Short_Name] AS ([dbo].[GetNameWithFlat]([Name])) PERSISTED,
[Name_Checksum] AS (checksum([Name])) PERSISTED)

I tried using Formula, but it doesn't create the columns
Left by Dennis on May 21, 2008 10:03 PM

# re: Create and Update Database Schema

Requesting Gravatar...
@Dennis: what is "PERSISTED"? Which Database Product do you use?
Left by Gabriel Schenker on May 22, 2008 12:15 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Hi,
ich have a question to the parameter "unique-key".
What I really want is, that the name would be published too.
Like this:
create table Person (
Id UNIQUEIDENTIFIER not null,
FirstName NVARCHAR(50) not null,
LastName NVARCHAR(50) not null,
primary key (Id),
unique uk_Person_Name (FirstName, LastName)
)

Is this possible?
Thanks

Left by Sandra on Jun 24, 2008 2:44 AM

# re: Create and Update Database Schema

Requesting Gravatar...
@Sandra: as far as I know it is NOT possible!
Left by Gabriel Schenker on Jun 25, 2008 8:45 PM

# re: Create and Update Database Schema

Requesting Gravatar...
@ Gabriel Schenker
What a shame! So migrations of a existing database scheme to a new version becomes more difficult.
Left by Sandra on Jun 25, 2008 9:48 PM

# re: Create and Update Database Schema

Requesting Gravatar...
@Sandra: to migrate an existing schema (in production) to a new version I don't recommend using UpdateSchema but rather a tool like Red Gate's Sql Compare which can produce the necessary alter scripts.
Use UpdateSchema during developement to sync the db's of each developer...
Left by Gabriel Schenker on Jun 26, 2008 7:24 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Hi, Gabriel
Thank you for the great article.
I have a <many-to-many> assosiation. But the generate link table has no primary key defined. It just contains two foriegn keys. But there are nothing to make them a combined primary key. Did i miss something?
Left by leilei on Jul 13, 2008 1:34 AM

# re: Create and Update Database Schema

Requesting Gravatar...
@leilei: if you NEED a primary key in the association table you might have a look at "ID-BAG" (please consult the nhibernate doc, or if you have time to wait I'll post an article on this very topic soon)
Left by Gabriel Schenker on Jul 20, 2008 6:07 PM

# Generating constraint names

Requesting Gravatar...
@Gabriel, I too would like to see the constraint names in the generated scripts, as per Sandra's comment.

In my previous job we ran into a lot of trouble when we let SQL Server generate random names for constraints. When the time came to change them, we had problems running our script against mutiple copies of the database as each database had a different name for the constraint!

However I really like this approach as there is no need to keep your scripts under source control any more, just the mapping files.

I wonder if it might be possible for me to submit a patch for NHibernate which will provide this functionality. I have not contributed to OSS before but this could be my first effort.
Left by Ross Neilson on Aug 20, 2008 2:24 AM

# re: Create and Update Database Schema

Requesting Gravatar...
@Ross: every body is highly welcome to provide patches to NHibernate!
You still have some scripts to keep under source control though (when you migrate your productive database from one version to the next you'll probably want to use a tool like Redgate's Sql Compare to generate the alter script...)
Please have a look at:
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/08/04/manage-sql-databases.aspx
Left by Gabriel Schenker on Aug 20, 2008 4:25 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Gabriel,

We did use Sql Compare, for just that task, it really is a very useful piece of software.

I have got the NHibernate source code downloaded to my PC at home so I will try to produce a patch over the weekend.
Left by Ross Neilson on Aug 20, 2008 8:00 PM

# re: Create and Update Database Schema

Requesting Gravatar...
become as agust
Left by sankaran namboodiripad on Jun 29, 2009 1:54 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Humm... interesting,

Thank you for the great article.
I have a assosiation. But the generate link table has no primary key defined. It just contains two foriegn keys. But there are nothing to make them a combined primary key. Did i miss something

Thanks
Left by software development company on Aug 20, 2009 2:30 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Thanks for that great article. Well, you wrote you wouldn't recommend to use UpdateSchema to migrate a database. You recommend an sql compare tool. Well, i use Fluent NHibernate, so i dont have hbm.xml-files. Can you explain, how you would update the database scheme without loosing all the data? Would be very helpfull

Nico
Left by Nico on Aug 31, 2009 9:07 AM

# re: Create and Update Database Schema

Requesting Gravatar...
i think this site is very enjoyable to read .So thanks for it.
Left by Bingo umsonst on Oct 30, 2009 7:58 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Thank you for the great article.
I have a assosiation. But the generate link table has no primary key defined. It just contains two foriegn keys. But there are nothing to make them a combined primary key. Did i miss something
Left by beds on Nov 04, 2009 4:58 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Where did you get the script generated by the SchemaUpdate from? SchemaExport has the option to output the database creation script but I can't see an equivalent option for SchemaUpdate. I'd really like to be able to capture the update script.
Left by Steve on Nov 05, 2009 12:15 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Whoops, forgot my manners. Thanks for this article. It has really helped me get started with NHibernate.
Left by Steve on Nov 05, 2009 12:21 PM

# Mr

Requesting Gravatar...
Crimnology, Social & Behavioral Science, Criminal justice online degree, Criminal justice accredited degree, Criminal justice online university, Criminal justice online School, Criminal justice degree, Criminal justice accredited university
Left by mevric on Nov 05, 2009 9:35 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Excellent post you have here.PageRank has also been used to rank spaces or streets to predict how many people (pedestrians or vehicles) come to the individual spaces or streets.Thanks for sharing this article.
Left by how to play bingo on Nov 05, 2009 9:49 PM

# re: Create and Update Database Schema

Requesting Gravatar...
SchemaExport has the option to output the database creation script but I can't see an equivalent option for SchemaUpdate. I'd really like to be able to capture the update script.
Left by Orkut Greetings on Nov 16, 2009 10:33 AM

# re: Create and Update Database Schema

Requesting Gravatar...
I have come to know something new about Schema update here.
Left by work at home blog on Nov 26, 2009 9:27 PM

# re: Create and Update Database Schema

Requesting Gravatar...
I always feel great when I find the blog useful for and it takes place in my collection. And, moreover, my colleagues are just fixed on it.
Left by students with autism on Dec 03, 2009 1:09 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Great blog.It is really informative article. Thank you for sharing your experience and teaching us.
Left by php chat software on Dec 21, 2009 2:47 AM

# re: Create and Update Database Schema

Requesting Gravatar...
great site
Left by silver on Dec 21, 2009 7:11 AM

# re: Create and Update Database Schema

Requesting Gravatar...
i like this!
Left by pandora jewelry on Dec 24, 2009 11:44 PM

# re: Create and Update Database Schema

Requesting Gravatar...
What a shame! So migrations of a existing database scheme to a new version becomes more difficult
Left by Cheap Web Hosting on Dec 26, 2009 2:40 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Well, it is just a way of your seeing people and their actions. I keep to another point of view.
Left by web designer los angeles on Dec 29, 2009 3:26 AM

# re: Create and Update Database Schema

Left by coffee machine on Dec 30, 2009 7:55 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Greetings to you. I would like to maintain two database. one for storing the data from the GUI and another database for reporting service(SSRS).Now i want to move the data from orginal database to reporting database. how can i handle, either through trigger or any other method.Need Advice.
Left by all new casinos on Dec 30, 2009 10:13 PM

# re: Create and Update Database Schema

Requesting Gravatar...
thx for useful post.
also thx for xomments. i took a lot
Left by free samples on Jan 05, 2010 1:58 AM

# health coverage

Requesting Gravatar...
When I try to install the schema, I get several errors:

CREATE TABLE psql:flightschoolschema:72: ERROR: syntax error at or near "birthdate" LINE 24: birthdate DATE,

^

psql:flightschoolschema:86: NOTICE: CREATE TABLE will create implicit sequence "images_id_seq" for serial column "images.id" psql:flightschoolschema:86: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "images_pkey" for table "images" psql:flightschoolschema:86: ERROR: relation "users" does not exist psql:flightschoolschema:88: ERROR: relation "users" does not exist

.....
Left by health coverage on Jan 07, 2010 6:07 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Some hosts (Yahoo, for example) do not allow the ALTER command to be run from scripts (which may be the reason that install/update_to_latest.php failed in the first place). If you get permission errors, then you will need to run the queries manually using phpMyAdmin, a database management tool that is likely available in the host's control panel. It will hopefully have the necessary permissions.
Left by Web Design London on Jan 07, 2010 11:06 PM

# Web Site Development

Requesting Gravatar...
Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon
Left by Web Site Development on Jan 10, 2010 10:53 PM

# Web Design New Jersey

Requesting Gravatar...
This is a great blog, usually i don't post comments on blogs but I would like to say that this post really forced me to do so!
Left by Web Design on Jan 10, 2010 10:55 PM

# Web Design New Jersey

Requesting Gravatar...
i just wanna thank you for sharing your information and your site or blog this is simple but nice article I've ever seen i like it i learn something today.
Left by Web Design New Jersey on Jan 10, 2010 10:57 PM

# re: Create and Update Database Schema

Requesting Gravatar...
thanks - very useful.
you suggest purchasing Redgate's Sql Compare for formal upgrade scripts, but I would like to use update schema to generate a "template" upgrade script to tweak by hand.

Is there a way to programmatically export the script from schema update rather than apply it immediately. Create schema has overrides for exporting that update schema does not seem to have.

thanks again - a useful post
Left by idegreen on Jan 12, 2010 10:36 PM

# re: Create and Update Database Schema

Requesting Gravatar...
good news
Left by make money online on Jan 16, 2010 1:16 PM

# re: Create and Update Database Schema

Requesting Gravatar...
Having revised your blog, it will take number one in my collection and will be read by my friends as well.
Left by flash developer on Jan 18, 2010 3:17 AM

# re: Create and Update Database Schema

Requesting Gravatar...
This is a really good read for me, Must admit that you are one of the best bloggers I ever saw.Thanks for posting this informative article.
Left by website marketing on Jan 18, 2010 5:02 AM

# Mr

Requesting Gravatar...
I will be passing this along to others that I know would want to read this.
Left by Cremation Urns on Jan 21, 2010 8:10 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Can anybody tell me how to Create and Update Database Schema in Oracle.
Left by Website Designers London on Jan 21, 2010 10:19 PM

# re: Create and Update Database Schema

Requesting Gravatar...
From time to time that falls out that you have no free time to finish the thesis project just about this good post. Some students do a big problem from that, just because some of them don’t know anything about thesis service, but we can give you suggests about the correct ways to detect the best buy dissertation service or how to buy thesis theme affordable.
Left by Miaad24 on Jan 25, 2010 2:01 AM

# re: Create and Update Database Schema

Requesting Gravatar...
ChronicDB seems like a new technology that can update schemas.

http://chronicdb.com
Left by Alonso on Jan 26, 2010 6:27 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Bookmarked!!!
Left by Glucosamine Chondroitin on Jan 26, 2010 4:27 PM

# re: Create and Update Database Schema

Requesting Gravatar...
What's more, a bracelet can also be equipped with different small pandora jewelry and even you can change it according to your mood at any time. Here are some meanings of pendant. Small Plane stands for traveling and adventure ; anchor, stability and hope; your baby's boots, having a lot of babies; small feeding pandora bracelets abundant food; Church means happiness and stability of marriage; dragonfly means riches; Eiffel Tower means travel and exploration; four-leaf clover means fortune; horseshoe means luck; Nest means a happy family; bride shows a happy bride in her coming pandora jewelleryship steering shows calming and confidence; pandora ukcoin pandora beadsshows rich marriage life. Wish bone, dreams being about to come true; pandora charm bracelets, love; one heart shot by an arrow, romantic love; purse, wealth; and heart-shaped lock, true love.
Left by pandora jewelry on Jan 28, 2010 3:48 PM

# re: Create and Update Database Schema

Requesting Gravatar...
i bookmarked it! thx!
Left by free samples without surveys on Jan 29, 2010 6:28 AM

# re: Create and Update Database Schema

Requesting Gravatar...
thx a lot
keep on sharing
Left by Live Hack on Jan 31, 2010 3:38 AM

# re: Create and Update Database Schema

Requesting Gravatar...
Great I like it so much your this work.
Left by PVC window on Feb 03, 2010 10:24 PM

# re: Create and Update Database Schema

Requesting Gravatar...

Requesting Gravatar...
Great I like it so much your this work.
Left by kapadokya on Feb 05, 2010 10:21 AM

# re: Create and Update Database Schema

Requesting Gravatar...
It is a nice sharing, we like it.
Left by registry cleaner reviews on Feb 05, 2010 10:26 PM

# Thanks

Requesting Gravatar...
Thanks for good information.
Left by araç sorgulama on Feb 06, 2010 9:16 AM

# Awesome

Requesting Gravatar...
Blogging is now becoming one of the new phenomenal ways to make money online. It is no surprise because you can work on your own hours, if you call it working that is.
Left by make money online on Feb 06, 2010 9:52 AM

Your comment:

 (will show your gravatar)
 
Please add 5 and 2 and type the answer here: