As currently implemented, the tabular file in storage only has the data rows. And the header is added in real time, every time the file is downloaded; generated from the DataVariable objects in the database. There was some ancient legacy reason for this implementation. It's not clear if it's still relevant; and it would simplify the download framework a whole lot.
Potential drawbacks:
- Would require a migration process, to add the header to any existing tab files.
- If we ever add a mechanism for changing the names of data variables, that stored file would need to be updated (next time the dataset is published, for example?) to reflect the changes in the header.