Two-level tagging
Have you ever had trouble deciding where to store a file on your hard disk? Or worse, had trouble finding it later?
When you store a file on your hard disk, you have to decide which folder to put it in. That folder can in turn live inside other folders. This results in a hierarchy, known in computer science as a *tree*.
The main problem with trees is that sometimes you want things to live in multiple places.
Tagging provides an alternate system. Tags are a lot like folders, except that things can belong to multiple tags. However, but the tags can't themselves belong to anything. So you have just one level of organisation with no nesting.
The main problem with single-level tagging is that it's too simple. We want to be able to use fine-grained categories (e.g. 'lesser spotted greeb') that themselves belong to higher-level categories (e.g. 'greeb', or even 'bird' or 'animal'). But we said that tags can't themselves belong to tags.
Described like this, perhaps the solution will seem obvious to you too. We want things to belong to multiple tags, and for those tags to sometimes belong to other tags.
I built this into Emacs Freex, my note-taking system.
For instance, I have tagged this blog post with 'Tagging' and 'Emacs Freex'. In turn 'Emacs Freex' is tagged with 'Software'. So I can find this blog post later in various ways, including by intersecting 'Tagging' and 'Software'.
This gives you the best of both worlds: things belong to multiple categories, along with a hierarchy of categories.