I have a subcollection for each doc in the users collection of my app. This subcollection stores docs that are related to the user, however they could just as well be saved
The only potential technical advantage to sub-collections that I can think of relates to document size -- it allows you to omit a reference to the parent element. (i.e. for each related rootDocument -> subCollection, there is a single pointer from the root collection document to the subcollection).
/messages
|
--> /messages/tags
When tags are a sub-collection then they don't need to save the messageId because you access the tags through message document:
collection("messages").document(messageId).collection("tags")
/messages
/tags
With a root tags collection each tag would need to store messageId. This basically flips the direction of the pointers.
collection("tags").whereEqualTo("messageId", messageId)
Sub-collection: pointers go from one -> many
Root collection: pointers go from many -> one