Create a simple schema where ALL roles are optional and expected uniqueness constraints apply.
Person(name) has Age()
Person(name) is married to Person(name)
The DDL creates a foreign key from spouse to spouse. Because all roles are optional, I'm not sure the foreign key should be created. If I have recorded Bob being age 25 and then want to indicate that Bob is married to Mary, I shouldn't have to add a new entry to the Person table for Mary.
Similarly, create a simple schema where all roles are optional and expected uniqueness constraints apply.
Person(name) has Age()
Person(name) likes IceCream(type)
The DLL creates a foreign key from PersonLikesIceCream to Person. Because all roles are optional, I'm not sure the foreign key should be created. If I add the fact that Bob (a new person) likes Chocolate, why do I also need to put a new entry for Bob in the Person table?
Implementing it the way you have makes it easier to run reports that enumerate Person because all Person are identified in one table. But this is only a benefit when there is at least one functional fact role. In the schema below, there is no Person table, so it is more difficult to enumerate all Person.
Person(name) likes IceCream(type)
Person(name) speaks Language(name)
Suppose this schema:
Person(automatic id) has Name()
Person(automatic id) likes IceCream(type)
If you enter a new Person 'Bob' who gets an automatic id of 10, and then you want to specify that Bob likes Chocolate, you can't do this with some databases because you can't enter the specific number 10 into the automatic id field of the ice cream table. So in this case, it helps to create the foreign key constraint even though all roles are optional.
SO...I'd like to understand better the thinking behind when foreign key constraints are put in the DDL.