I would expect that user badges would be stored with a schema similar to this:

UserBadges(@id, @userId, @badgeId, @creationDate)

Instead, according to this explanation and the datadump, there is no badgeId column; rather there exists a column where the badge name is stored as a string of text.

This may be for performance reasons, to minimize joins, for example. But such a schema has a substantially greater memory footprint than one that stores a badgeId. Is this a case of choosing the lesser of two evils?

Post tags are handled differently, and I would like to know why. Each post tag is stored as an individual record with a postId and tagId columns in a PostsTags table, without an id column. Getting the tag name in this case would require a join, unless you grab it from the post.

Why does it make sense to apply one strategy for badges and quite another for tags? Can anyone elaborate on this?