For example, I have a table that stores classes, and a table that stores class_attributes. class_attributes has a class_attribute_id and a class_id, while classes has a class_id.
I’d guess if a dataset is “a solely child of” or “belongs solely to” or “is solely owned by”, then I need a FK to identify the parent. Without class_id in the class_attributes table I could never find out to which class this attribute belongs to.
Maybe there’s an helpful answer matrix for this?
Wikipedia is helpful.
(and it goes on into more and more detail)
If you want to enforce the constraint that each row in class_attributes applies to exactly one row of classes, you need a foreign key. If you don’t care about enforcing this (ie, you’re fine to have attributes for non-existent classes), you don’t need an FK.