What about a simple table with `varchar` primary key (used as foreign keys) instead of enums?

Well, what will you store in this varchar column? String representations of your enums?

Then, what happens when you change the name of one of those enum fields in your application? What happens if you load a string that is none of the possible enum values in your application?

And besides this, a varchar-column takes significantly lot more space than a single TINYINT column (which, by itself, can already store more different enum values than you’d ever need)