When declaring a two-dimensional array in storage you are creating in reality nested arrays. And you do not need to declare sizes.
pragma solidity ^0.4.18;
contract C {
// data[n] is an array of uints
uint[][] data;
function append(uint _a, uint _b) public {
data.push([_a, _b]);
}
function read(uint _idx) public view returns (uint[]) {
return data[_idx];
}
}
Without more details about your problem is hard to recommend a particular solution.
Arrays are more complex than mappings and can be slightly more expensive to use when adding a new element.
Deleting a single element in an array does not resize the array, and you will need to find out how to deal with such situations.
You can iterate an array but not a mapping. Also iterating a large array can cause out of gas errors.