Event properties are schemaless
Every product tracks different things, and a column per property would mean a migration for every new event anyone wants to send. A properties blob accepts all of them. The cost lands on reading: queries have to extract fields that may be absent, misspelled or of the wrong type, and a typo in an event name creates a second event nobody notices until a chart looks wrong.