If you attach data to objects like I posted above, each object could be dealt their sole table (multiple objects can use the same one), then it's easy to get the right table, a single FlushChildHashtable per object still suffices and it's kinda balanced.
That's basicly how I'm handling it.
Every system got it's own hashtable. And then there's general purpose hashtables that are used for attachment of any (useful) kind:
a TimerHash, a UnitHash, an ItemHash.
The first stores any amount of 2-dimensional data based on the GetHandleId() parent key. This, however, requires each user to use local timers to keep each handleId unique instead of attaching to general purpose 32fps timers.
Since that was benchmarked to be faster in a lot of cases anyway, there's no reason not to do that.
The UnitHash is only for one-dimensional data, which means I can only put a struct in, as the parent key is reserved for a spell/case/whatever ID to avoid collision.
ItemHash works the same as UnitHash and is also 1-dimensional.
Needless to say, I almost only use TimerHash (for spells and scripted events). Attaching to units or items are extremely rare cases imho, as most data you might want to store to units or items are usually system-exclusive (and those got their own table).