I would like to know if there exist guidelines for establishing CI relations. We are in the process of "cleaning up" our CMDB and several categories will need to be reclassified, as well as Parent/Child (and possible other free form) relations will need to be established.

The greatest consideration is for minimizing maintenance efforts for when CIs are deleted.

ITIL only gives some guidelines to define relationships among CIs in chapter 7.6.2 of Blue Book what ITIL says about relationships is:
(I copy below for educational purposes)

"CI relationships
The relationships between CIs should be stored so as to provide dependency information. For example:

a CI is a part of another CI (e.g. a software module is part of a program, a server is part of a site infrastructure) – this is a ‘parent/child’ relationship
a CI is connected to another CI (e.g. a desktop computer is connected to a LAN)
a CI uses another CI (e.g. a program uses a module from another program, a business service uses an infrastructure server).
There may be many more types of relationships, but all of these relationships are held in the CMDB – this is one of the major differences between what is recorded in a CMDB and what is held in an asset register."

From my point of view a CI should never be deleted, it should be define an status "retired", if you delete an item you cannot have historical information about that device, I really think you are loosing a valuable knwodledge.

Actually, I realize that "deleting" was not the best example. The main concern that still remains though is how to manage (re-assign) large number of relations.

What we are doing at the moment is trying to replace existing CI structure, which will include re-defining some categories, creating new ones and re-assigning existing relations. With close to 30,000 items in the CMDB, the process of manually managing relations does not seem feasible. So, basically, does defining relations in a certain way can make the process easier.

Another questions then I guess is what way exist there to perform the task described above? Does it involve mucking around with the SQL on a backend or perhaps there are 3rd party tools available that can help to achieve what we're trying to do here.