Your three types are probably easiest handled as FK associations with the fundamental tree.
The tree can be homogenous -- class MyNode
is a direct subclass of treebeard.Node
. Your node can have a flag (Root, Middle, Leaf) and FK's for A or B or C. This allows you some SQL-like flexibility in querying MyNode instance.
This allows your tree to grow. A node can start as a type C (leaf) and then morph to a type B (intermediate). You change the status, and change the FK's.
The alternative is a bit more complex.
class MyA( treebeard.Node ):
pass
class MyB( treebeard.Node ):
pass
class MyC( treebeard.Node ):
pass
In this case, you can't "morph" a node. When a node starts as a MyC
, and gets children, you have to remove the original MyC
instance, and replace it with a MyB
version that has a new node as a child. This isn't impossible, but it can be painful.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…