我有一个Postgres数据库,在其中我在一个表中存储一些分析数据,如用户ID、城市、国家、源(引用)、设备类型(web、ios、android)等。
我想展示基于上表中数据的见解,即
- 用户日期范围内所有不同的城市、国家或源或device_type
- 用户在日期范围内排名靠前的城市、国家或来源
- 用户在某个日期范围内的请求总数
到目前为止,使用案例仅限于给定时间范围内来自任何用户的顶级请求,并且由于上表中的数据可能非常大,我们在单独的表中按天对每个用户预先聚合了数据
但现在我们必须根据城市、国家、源和设备进行聚合,为每个字段创建单独的表似乎不是最好的解决方案。
请让我们知道,如果有任何更容易和更优雅的解决方案,我们的问题。
此外,我们还探索了NoSQL数据库来存储数据,因为这些字段在未来可能会增加,但数据聚合部分是我们希望首先解决的问题。
谢谢你
2条答案
按热度按时间2g32fytz1#
我将数据分成请求表、客户表和客户统计表。NoSQL适合存储请求或原始数据,假设您只需要用于分析的数据。
将“日志”与客户端和统计数据存储在一个单独的数据库中并不是一个坏主意。您可以优化日志数据库的写性能,而优化另一个数据库的读性能。处理日志数据库中的数据量非常容易,因为它是按日期时间排序的,所以您可以轻松地对最近的数据进行分区和优化。
我曾经使用过这样的SQL数据库,它拥有许多TB的数据,但在几秒钟内就完成了过去几GB的聚合函数,而索引列的总和却没有where,这需要几个小时。NoSQL更难优化,但可以是一个不太复杂的解决方案。
yjghlzjz2#
这是一个列式存储解决方案的很好的用例。2如果你的postgres示例是自托管的,你可以使用一个外部数据 Package 器,比如cdw_store,它以列式格式存储你的数据,使你的查询更快。
如果数据量巨大,并且您正在进入非结构化数据领域,您还可以考虑Snowflake等解决方案