Atualmente, os bancos de dados relacionais são ineficientes, mas ao armazenar o tipo de logs de que você está falando, você realmente não precisa de eficiência, porque eles não serão constantemente acessados pelo jogo ou por seus usuários - apenas sua equipe precisará para ler os dados.
Portanto, "eficiência" não importa tanto. O que importa mais é encomendar os dados de uma maneira que facilite a história do que os usuários estão fazendo no jogo. Seus desenvolvedores geralmente precisam consumir esses dados e exibi-los em uma interface fácil de ler para analistas. Às vezes, os analistas precisam consultar os dados para se aprofundar no comportamento do usuário. Por exemplo, se os jogadores estiverem comprando um determinado item antes de uma atualização, mas pararem de comprá-lo após uma atualização, o analista se beneficiará escrevendo certas consultas que expõem certos números sobre o comportamento em torno dessa compra para determinar por que os usuários não a compram mais. É melhor que eles tenham uma linguagem de consulta padrão para trabalhar e que esteja bem documentada. Se eles tiverem que fazer essas consultas em um formato binário personalizado, seus trabalhos serão muito mais difíceis,
Geralmente os eventos do jogo são parecidos com este (este é o formato do DeltaDNA em particular)
{
"eventName":"specific event code – eg. gameStarted",
"userID":"ABCD1-4321a879b185fcb9c6ca27abc5387e914",
"sessionID":"4879bf37-8566-46ce-9f3b-bd18d6ac614e",
"eventTimestamp":"yyyy-mm-dd hh:mm:ss.SSS",
"eventParams":
{
"platform":"WEB",
"param1":"stringParam",
"param2":true,
"param3":1234,
"param4":["a","b","c"]
},
}
O evento geralmente inclui um nome de evento, um ID do usuário, um ID de sessão, registro de data e hora e parâmetros que permitem gravar os dados que achar úteis para gravar em torno desse evento. E, na minha experiência, os formatos de banco de dados relacional são os melhores para gravar essa estrutura.