If you want to make the data readable only with a private key, and each user does not have their own node, you would need to encrypt the data before publishing it on the chain.
In terms of the parallel with databases, you can think of each stream as like a database table. And each key (in the sense of a stream item key) represents one way in which you may want to efficiently retrieve that data in future.