I know Solana does not have a HashMap data structure as a design pattern.
Does that mean developers should use program derived addresses (PDAs) for each user or stake pool instead of making an array/vector of users or stake pools for data storage?
This question is a bit subjective, since it's asking an opinion of how to handle storing lots of information on-chain with Solana. Both options are possible: you can store a vector / array on-chain in one account, or you can use program-derived addresses as a sort of on-chain HashMap. It's a tradeoff.
If you store a vector in an account, you are limited to the size allocated at the start, but it may be quicker and cheaper to store a certain number of values.
If you need to store a huge amount of data and you have a good model for generating keys, then creating accounts at program-derived addresses may be a good fit. You will need to pay rent for each account, so it may be expensive if you're not storing a lot of data in each account. You can use solana rent <ACCOUNT_SIZE>
to estimate the costs for both approaches.