In Clojure, the common advice is "just use a map". There's some truth to that, but it's obviously more complicated. Clojure gives you lots of ways to model a problem. You can use:
- maps
- vectors
- sets
- functions
- strings
- keywords
- etc.
The truth is that choosing the right way to model the problem requires design decisions. Lots of tradeoffs. And lots of iteration. You might not get it right the first time. But you want to keep iterating until you get a tight fit between the structure of the problem and the structure of your code.
Each representation has limitations and tradeoffs. You want to find the limitations that help guide you to success and the tradeoffs you can live with. The hard truth is that it takes lots of experience to be able to do it quickly. But there's no magic to it.