Thanks, r937. I didn't realize that this was an established method.
Stepping out of the structure for the big picture, what I'm trying to do is set up a way for a user to select the species for a picture they are uploading to a natural history site. When they pick a species the image gets all of the inherited tags like:
Group: Crotalus atrox
Keywords: Crotalus atrox, western diamond-backed rattlesnake, western diamondback rattlesnake, Víbora-cascabel de diamantes
Parent Group: Crotalus
Keywords: Crotalus, rattlesnakes
Parent Group: Crotalinae
Parent Group: Viperidae
Keywords: Viperidae, pit vipers, vipers
Parent Group: Serpentes
Keywords: Serpentes, serpente, serpents, snakes
Parent Group: Squamata
Parent Group: Reptilia
Keywords: Reptilia, répteis, reptiles, Reptiles
Parent Group: Vertebrata
Keywords: Vertebrata, vertebrado, vertebrates, vertébrés
Parent Group: Chordata
Keywords: Chordata, chordates, cordado
Keywords: Animalia, animal, animals
so the picture gets whatever keywords are assigned to it as well as all of the following keywords:
Crotalus, rattlesnakes, Crotalinae, Viperidae, pit vipers, vipers, Serpentes, serpente, serpents, snakes, Squamata, Reptilia, répteis, reptiles, Reptiles, Vertebrata, vertebrado, vertebrates, Chordata, chordates, cordado, Animalia, animal, animals
and if any of the parents have changes in keywords this is reflected in all of the children.
The problem I see with the nested set model is that there would be hundreds of thousands of groups, each with multiple keywords. Do you have any suggestions on how MySQL could efficiently deal with that sort of set up?