The idea is to keep track of values using the keys
key : value. So when you need that value, just give it the key and it will return the value.
mapping(address => uint256) private _balances - address is the key and uint256 is the value. So each address is associated with some number, in this case, balance. If you want to retrieve someone's balance, give it the address and it will return the balance:
To retrieve that uint256 value from a given mapping, you just call
_balances[address] and voila. If you want to populate that address with a new balance, do the same thing
_balances[address] = 1000.
mapping(address => mapping(address => uint256)) private _allowances; This is nested mapping, more advanced technique to keep track of things. Once you understand how mapping works with examples, you will quickly grasp the concept of nested mappings as well.
And to respond to your question, no there is no other alternative to mapping. It's a unique way to keep track of data. Some might say there is an array as well, and it is somewhat true. In an array, you have the index as the key, and the value itself, but the index can only be a numerical value and as you saw in mapping, key can be anything.