I once had to design an extremely flexible flat-file database for a client, who needed the ability to define fields at will (not only text but numbers too).
I settled upon a table called schema which defined the fields, and a table called user_fields which contained the information. Each row was a tuple:
{ record_number, field_number, text_value, numeric_value }
The user's input would be stored in numeric as well as text form if the input could be translated to a number; otherwise it was only text.
It took a wee bit o' programming to make this all work, but work it did, and surprisingly well.