No, but ... you can break scability with naive functions.
Your contract storage can expand as much as you and your users can afford to write. In your example, the users pay for gas for insertions which is usually what you want. As the developer, you also need to take care to ensure that no contract function has a gas cost that increases with scale.
mappings are very useful for constructing functions that complete for a predictable cost at any scale since the lookups of keys and values is completed in a single operation at a scale-invariant cost.
Iterative processes that loop over the dataset will increase in cost with the scale of the dataset. This would create a cost that increases with scale and a hard limit when this cost exceeds the network's gasLimit, at which point the so-designed function will cease to work at all.
For this reason, an unbounded loop (for(i=0; i<; i++)) is usually considered an anti-pattern. When you find yourself tempted to do that, consider alternatives.
Process a single row: function doSomething(uint row) ....
Fetch a pointer, then fetch the data: bytes32 key = index[row]; return mappedData[key];
Something else that completes at a cost that is indifferent to the size of the list.
Look over here for some scaleable patterns: Are there well-solved and simple storage patterns for Solidity?
Hope it helps.