There's nothing wrong with any of the above. the OP looks to be looking for declaring things as constants. In C, this is done either with a const variable, or using the pre-parser's #define. VHDL allows constants to be declared in an entity, package, or instantiation (generic). A constant array, even with very high level constructs, will usually synthesize just fine. eg, a constant array(0 to 511) of records containing fixed length strings, integers, ect... is just fine. Such might even be used with a function to allows a user defined ASM format to initialize a block ram.
Constant Arrays will usually infer ROMs or simple LUTs (depending on size), while non-constant arrays can infer RAMs. A key issue is resource sharing -- large RAMs/ROMs get mapped to the BRAM elements, which have a limited number of read/write ports. When more reads/writes (per cycle) are needed, the synthesizer needs to get creative, and at a minimum duplicate the ROMs/RAMs. In some cases, it will not use the BRAMs, but will use registers. In such a case the design will be very large.