You can also create a data type for the “categories” but still have an option set on it. I did this recently for “asset types” in an app.
The user wanted to be able to edit the asset types and add/remove them - so they couldn’t be option sets.
But certain asset types trigger actions and filters in the app logic so I added a “system asset type” to the asset types. This way my filtering logic is easy as I’m referencing an option set instead of an id, and the user still gets the functionality they want.
Most of the asset types ~ 80% are not used in the logic so the option set gives me simplicity and hides the logic from the user. I also use it to hide the delete for the system asset types so the user couldn’t stuff up my logic.
Option sets are very useful and I will occasionally add hidden option sets just to make the logic easier/faster to map and understand for frequently used parts of the logic where I have specific data triggering things.