To answer you other question first: Looking briefly at you schema, I think the timestamp table should be a struct. You could also consider if all fields should be long. Place smaller fields last in the struct so you don't waste alignment.
Otherwise I think the layout makes sense - I can't say if the type of each field is the right for you data - and I don't think you should sacrifice function to minimize space. Use tables when you need flexibility or when you don't use most of the fields. Use structs for small fixed items. Avoid writing table fields than can have a default or are not in active use.
LZ4:
It isn't a combined FlatBuffer + LZ4 tool, although it could be - LZ4 has a very nice streaming protocol format that could be added to the FlatBuffer interface, but for simplicty just compress after creating the buffer and vice versa for reading. You loose direct buffer access, but it is still much faster than field by field compression like protobuf.
There are LZ4 libraries in almost any language. It should for example be only a few lines in Python which makes LZ4 attractive - fast, widely support, easy to integrate into embedded systems with minimu overhead. Zlib would also work - better compression, but slower and more overhead.
Advanced use: I am only intimately familiar with FlatCC, the C binding: you could create you own emitter object that compress one LZ4 block at a time and emits it to a stream. Due to back to front operation the blocks would be reverse ordered, but you just fix that when reading back. Even without compression, this is a nice feature of the LZ4 format. I have considered doing this, but think perhaps it is best to keep FlatBuffers simple. In this way you don't need to store the entire buffer in memory or on disk before transmission.