The answer is mechanically derived from the idea of functional dependence.
For meaning to exist in one respect, it implies that meaning must exist in another. When this is true, there will be a foreign key restriction from the dependent table (first) to the independent table (last)
Another way to look at this is that a one-to-one relationship is really just a special case of a one to many relationship; only instead of many, you are only allowed one.
in SQL:
CREATE TABLE independent ( id INTEGER PRIMARY KEY ); CREATE TABLE dependent ( independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id) );
As one for many, many have a foreign key for the one, but to turn many into one, just make it unique . It is usually convenient to express all this, making the foreign key column in the dependent relation the primary key for this relationship:
CREATE TABLE dependent ( independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id) );
Edit: I noticed that your name is asking a different question than what your body seems to be asking. The above is responsible for the header.
From the point of view of database normalization, it is probably preferable to use several tables, as indicated above, in favor of attributes with a null value. Nulls is a kind of out-of-band way of saying that the value of a particular attribute is somehow “special”, but does not really provide any specific interpretation of what that might mean. Zero manager_id probably means something completely different from null birthdate , although they have the same sign.
Adding tables is by no means considered bad, from a strictly abstract or academic point; nor add attributes. The choice should always be based on what data you really need for modeling.
However, there are some very real practical reasons for using one or the other. The most obvious reason for performance is associated with the cost of using one or the other. When an optional value is usually used, the extra space used by the foreign key and the corresponding index does not provide itself well. Similarly, if an optional value is rarely used; it is more compact to put these values in a different relation. Having the nullable attribute will consume space in the table, which is almost never used.
Computing, which basically requires actual data, and testing the performance of these (and possibly other) configurations to see which one works best.