actually i'd fire off the 'system' as the record key, simply given some sort of long int key number, the co-ordinates are a property of the system this way (plus the Db can work with integer keys this way). 2d/3d. Go 3d, if you want 2d its easy, use zero the third dimension at creation time (i'm assuming the ability to generate systems is part of all this.
UWP values? hmm. I'd be tempted not to store them at all (except maybe as quick refs in calcuated fields stored to save time) but store the actual data.
Thus world size is stored as diamter in Km, atmosphere stored as a pressure/composition/temerature/whatever else seperate structures. With a routine to spit out the UWP from this.
Thus since its doing the maths, you can havea UWP and you can have any level of detail you want over and above this. Yes the UWPs get a table of their very own for the text string lookups but the actual UWP is a derived value *not* the core data.
actually all you store in the 'core' table is the system id, orbital raduis from the parent object and the objects referecne key.
Note the parent can be a star, or a psuedo object for the centre of gravity in a binary system etc. Each object only knows how far it is from its centre of orbit. A scan for a 'object' can provide details of its direct children, grandchildren are found by walking the data tree.
This also allows for several other data tables, each using a core table object ref as a key. One table for stars, one for gas giants and one for more solid planets (and maybe one for strange stuff).
Its even possible to allocate a deep space station via this method.
Actual 'object' co-ordinates personally i'd store as a tripple integer (or tripple double maybe) all child objects don't need this infomation, thus it is stored in yet another key table.
Thus we have the following tables
[core]
id, x, y, z
[object]
id, core.id, parent, radius, name
[planet]
object.id, uwpdata, notes
[star]
object.id, stellar type, notes
[gas giant]
object.id, gg-data, notes
[unusual objects]
object.id, notes
thus the looks ups *can* be a bit nasty, but since the code only needs generating once this is not a problem.
the object table is used mostly to handle stuff common to everything in the system, the other tables are used to save space, since so much of the data will not be needed for the most common object (a red dwarf). this method also allows for additional tables to tie into the objects table, maybe a 'GM comments' table to store game specific stuff (with a key for the game) etc.
this also avoids storing table names, you essentially scan all the child tables for a given 'object.id' to see if it holds any infomation about the object in question. sorting by the orbital radius puts things in order. naturally if one of the children of a given object has an orbital raduis of zero and is in the star table, its reasonable to assume tis the primary.