in reply to store/query semi-structure data
I generally approach problems like this as having two distinct parts: (1) “storing it,” and then (2) “efficiently searching it.”
The technique that I most-frequently adopt for storing the data is to use YAML, stored in a long-text field. The simple reason for this is, that it is human-readable. (Also, I have had various problems with Storable over the years, where I found that for whatever reason I could not exactly “thaw” what had been “frozen.”)
For the second part of the problem, I build additional tables which contain pure search-fields ... metadata, listing the various records where a particular value-of-interest might be found. The logic which encodes-and-stores a record, also updates these metadata tables. Searches involve SQL queries to determine the list of records where a desired value might be, followed by individual retrieval and decoding of the candidate-records (using procedural logic) to determine where the values actually are.