The number of different tiles you use really depends on what platform you're developing on and how much memory you want to dedicate to just storing tiles. Are you using pre-generated tile maps, or creating them on the fly? You can of course have a larger variety of tiles than are loaded at any given tiles, so a map might have 100 tiles, but you have banks of 25 tiles which are loaded at any given time. But on the disk you could have as manay banks as you wanted to create.
Most tiling systems use a simple shape that is the same throughout the level you are building, for example RCT3 uses a grid of squares, Civ 5 uses a map of hexs. For aperiodic tiling you use a number of different shapes to build the map. This gives you potentially a larger number of possible combinations, but does become a more difficult data structure to manage. For a grid you can represent it as a 2D array, or even a linked list.
I suppose you could use a linked list for apredioc structures as well (but jumping around would be more difficult as you have more than 1 possible set of offset values). Some sort of spatial node map would probably be a better method.
Michael