Я не знаю о животноводстве, но, похоже, ваш Sire_ID это отец, а Dame_ID это мать? Нет проблем. Одна строка на животное, ноль sire_ и dame_ID для купленных животных, никаких проблем не предвидится.
[ID],[Sire_ID],[Dame_ID];
0,null,null (male)
1,null,null (female)
2,null,null (female)
3,0,1 (male)
4,0,2 (male)
5,null,null (female)
6,3,5
7,4,5
и т. Д. Вы, вероятно, заполнили бы TreeView или XmlNodeList в цикле while ...
While (myAnimal.HasChildren) {
Animal[] children = GetChildren(Animal.ID)
for (int x=0; x<children.length; x++)
myAnimal.Children.Add(children[x]);
}
В данном случае Animal.Children - это коллекция животных. Поэтому myAnimal.Children [0] .ather вернет myAnimal. .Parent [] может быть коллекцией двух его родителей, которая должна работать, если [0] всегда один из родителей (отец), а [1] всегда другой (мать).
Сделайте ID идентификатором PK и назначьте Sire_ID и Dame_ID программно, возвращая идентификаторы его родителей. Никакие связи с внешним ключом не должны быть необходимыми, хотя оба родительских идентификатора могут ссылаться обратно на идентификатор, если вы действительно этого хотите.