Quick answer:
Use the rendering in a unique color technique.
Longer answer:
I wouldn’t use the old selection methods of OpenGL anymore. It isn’ available on all plattforms (MacOS with a 3.2 context, OpenGL ES if you want to port to that), it isn’t so widely used so I don’t think the performance of this has a high priority for driver devs (might be wrong).
Rendering everything in a unique color, read one pixel from the backbuffer, clear the buffer, render your scene normally (so you will never see the colored picking buffer on screen) works very well. You can also do this in a FBO in a lower resolution if you like etc. Quite flexible but also simple solution.
Ray casting involves implementing ray casting A lot of work and probably slower (there might be special cases where this is a good idea).
It doesn’t matter how you draw your models as long as you can color each individually.
That can be done with an alternative attribute for per-vertex colors (has the downside of a lot of redundancy) or better just as a uniform in a special fragment shader that just sets each fragment to the given color value. The underlying geometry is irrelevant.
The limit ob individual objects you want to pick is 2^(8+8+8+8) for 8bit RGBA render targets. If you want to select objects and not individual triangles, that should be sufficient. You can also use render targets with 32bit per channel and multiple render targets if you use shaders… You will run out of memory for your geometry before the ‘picking-space’ gets too small.
You don’t have to use them. Depending on what you also want to do, you might run into limitations of the fixed function pipeline later on…
You can set an individual color per triangle, either with the fixed-function pipeline, an extra attribute or even rerive a color in the shaders from gl_PrimitiveID. It depends on how you want to draw your stuff and whether you want to use shaders.