十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Positorium:统一关系、图、列存、键值四种模型的多模数据库

Positorium:统一关系、图、列存、键值四种模型的多模数据库 几个月前我在整理一套内部工具的数据存储方案时遇到了一个很典型的纠结数据本身有明确的关系需要支持类似 SQL 的查询但其中一部分数据又天然是图结构比如用户、设备、事件之间的关联还有一批指标类数据希望按列存储来加速分析另外又有一些配置类信息键值对就够了。当时的第一反应是那就上多个数据库吧关系库、图库、列存库、键值库各管一段。但真这么做之后问题很快来了——数据要同步、要维护多套连接、要做跨库关联查询复杂度直接翻倍。也就是在查资料的时候我看到了 Positorium 这个项目的标题Database with features from RDBMS, graph, columnar, name-value DBs。翻译过来就是一个试图把关系型、图、列存、键值几种数据库能力揉进同一个系统里的项目。这个设计思路很有意思因为它不是简单地在某个数据库外面套一层壳而是想从底层能力上把这几类数据模型统一起来。这篇文章我想从几个层面拆一下它到底想解决什么、底层可能怎么设计、适合什么人用、以及真正落地时会遇到哪些问题。1. 先搞清楚这个项目想解决的不是存储问题而是数据模型割裂问题很多人看到多模数据库这几个字第一反应是这不就是把几种存储引擎堆在一起吗其实不是。Positorium 更值得关注的地方是它想统一的是数据模型而不只是存储介质。1.1 常见多模数据库的两种实现思路在聊 Positorium 之前先看看市面上多模数据库通常怎么做。大致分两类第一类是多个引擎一个入口。典型代表是某些数据库在底层分别挂了关系存储、文档存储、图存储对外提供统一的查询接口。这种方案的好处是各引擎可以独立优化坏处是跨模型查询很痛苦而且数据一致性同步成本高。第二类是一个存储多种视图。也就是底层物理存储只有一套但上层可以根据使用场景把同一份数据解释成关系表、图、列簇或键值对。这样做的好处是数据天然一致不需要同步而且跨模型查询可以做到更高效。Positorium 从项目标题看明显是走第二条路。它想做的是在一个数据库内部同时具备 RDBMS、图、列式、键值四种数据能力而不是把四个数据库拼在一起。这也解释了为什么这类项目通常不会一开始就追求极致性能。因为它的核心卖点是数据模型统一而不是单点性能碾压。1.2 真正被解决的问题数据模型的翻译成本在实际工程项目里数据模型割裂带来的成本往往被低估。比如一个简单的用户行为分析系统用户基本资料适合放关系库因为要支持结构化查询和事务。用户和好友、用户和关注对象之间的关系适合放图库因为要算路径、找社群。行为日志适合放列存库因为要做聚合分析。用户偏好设置适合放键值库因为读取频繁、结构简单。如果拆成四个库每次写入用户数据时就要同时写关系库、图库、日志库、缓存库。一旦某个写入失败数据一致性就成了灾难。而且如果要查某个用户最近一周的活跃好友里哪些人共同关注了某个话题这类跨模型查询基本要靠应用层拼接代码复杂不说性能还很难保障。Positorium 想做的就是让同一份数据既可以用 SQL 查也可以用图遍历方式查还可以按列做分析或者当键值对直接读写。开发者不用再关心数据到底存在哪个引擎里只用关心查询语义。1.3 项目定位判断从项目标题的措辞看Positorium 更像是一个研究性质或实验性质的项目不是那种开箱即用、可以直接扛生产流量的商业数据库。它的价值更多在设计理念和技术探索层面。如果你是在做技术选型想找一个生产数据库我不建议直接押注这类项目。但如果你是在做架构设计或者想理解数据库底层实现这个项目的思路很值得拆解。2. 四种数据模型统一在物理存储层才是真正的难点要理解 Positorium 这类项目必须搞清楚一个关键问题四种数据模型怎么在一套物理存储上共存2.1 关系模型的存储基础与图模型的冲突传统关系型数据库把数据组织成表表由行和列组成。物理存储上行存适合按行读取完整记录列存适合按列聚合统计。图数据库则把数据组织成顶点和边物理存储上通常用邻接表或索引邻接表来加速遍历。这两种模型的底层结构是冲突的。关系模型按表组织图模型按顶点和边组织。如果强行用一个物理存储承载两种模型就要回答一个问题一条记录同时是表里的一行也是图里的一个顶点怎么安排它的物理位置Positorium 的解法思路大概率不是物理上同时存在两种格式而是在逻辑层做统一表示。比如可以把一张表的主键当作图的顶点表之间的外键关系当作图的边。这样一来同一份数据既可以从表视角查询也可以从图视角遍历。列存和键值对则可以理解为同一行数据的投影视图或索引视图。这其实是很多多模数据库都会采用的思路物理存储保持一套逻辑层通过元数据描述数据的多种解释方式。2.2 列式存储和行式存储的取舍传统数据库里行存适合 OLTP列存适合 OLAP。Positorium 如果既要支持关系查询又要支持列式分析就面临一个经典问题物理上到底怎么存一种方案是混合存储数据同时以行格式和列格式保存写入时双写查询时根据优化器选择合适格式。代价是写入放大和存储空间翻倍。另一种方案是纯列式存储行被拆成列存储查询单列很快但重建整行记录时有额外开销。还有更灵活的方案默认按行存但允许用户为某些表创建列式索引或列式投影。类似物化视图在写入时维护额外的列式副本查询分析型 SQL 时走列式副本。从实践看第三种方案更现实。因为不是所有表都需要列式分析强制全列存反而会让点查和插入变慢。Positorium 大概率也遵循类似的思路默认关系存储分析型场景启用列式视图。2.3 键值对模型的定位键值对数据库的核心优势是极简一个 key一个 value读写在单机上可以做到极低延迟。它是所有数据库模型里最简单也最灵活的一种。在 Positorium 里键值对能力不应该理解为额外的一种存储引擎而应该理解为最基础的数据访问接口。一张表的主键实际上就是一个 key整行数据就是一个 value。列簇也可以看作一种命名空间下的键值集合。所以正确的理解方式是键值对是底层的数据访问原语关系、图、列存是在这个原语上叠加的逻辑视图。2.4 统一查询层带来的优化空间当四种模型统一在一套物理存储上时最大的收益不是少装几个数据库而是跨模型查询可以下推到同一套存储引擎里执行。举个例子。你想查最近 30 天内与用户 A 直接或间接关联的用户中消费金额超过 5000 元的人有多少。这个查询同时涉及图遍历找用户 A 的多跳关联用户。关系过滤筛选消费金额大于 5000 的记录。聚合统计统计人数。在传统多库架构里这个查询要分三步做先在图库里遍历出候选用户再用候选用户 ID 去关系库查消费金额最后在应用层聚合。每一步都有网络开销和序列化开销。在 Positorium 这类模型下图遍历和 SQL 过滤可以在同一份存储上执行优化器有机会把两步合并成一个执行计划避免数据来回搬移。这个能力才是多模数据库真正的价值所在。3. 如果把它当成一个工程选择需要先接受它还不是生产级基础设施虽然 Positorium 的设计理念很吸引人但作为博客文章我必须说清楚这类项目落地到生产环境还有很多硬骨头。3.1 从项目成熟度看它更适合学习和技术预研Positorium 目前的信息主要停留在项目标题和概念描述层面没有完善的中文文档、没有大规模生产验证、也没有丰富的生态工具链。这就意味着如果你只是因为好奇想动手试试那很好但如果你是打算用在业务系统里需要谨慎评估。常见做法是先在本地或测试环境跑通基本功能确认几件事安装和部署是否顺畅。是否支持你需要的编程语言驱动。能否承受你的数据量级和查询复杂度。事务支持和一致性模型是什么。是否有备份、恢复、监控等运维能力。社区是否活跃遇到问题时能不能找到人求助。如果以上答案大多是否定的那它更适合放在技术雷达里跟踪而不是直接进入生产依赖。3.2 单机性能与分布式扩展需要分清楚很多数据库新手有个误区以为多模数据库天然就是分布式的。实际上支持多种数据模型和分布式扩展是两个完全独立的维度。一个数据库完全可以在单机上支持四种数据模型但分布式能力可能很弱。反过来一个分布式数据库也可能只支持一种模型。Positorium 标题里没有明确提到分布式能力所以稳妥的判断是它可能更侧重单机或小规模场景下的多模能力而不是大规模分布式集群。如果你有海量数据、高并发、多节点容灾的需求那评估时要重点确认它的集群部署方式、数据分片策略和一致性协议。除非有明确文档说明否则不要把单机多模数据库直接当分布式数据库用。3.3 冷门数据库的生态壁垒数据库最重要的是生态。一个数据库哪怕功能再强如果没有官方驱动、没有 ORM 支持、没有监控插件、没有云厂商托管使用成本就会很高。Positorium 作为一个小众项目生态一定是短板。这意味着团队里需要有人愿意深入学习它的底层机制。出了问题可能需要读源码去排查而不是搜一下就有答案。招聘时很难找到有现成经验的人。所以你在评估时不仅要评估数据库本身还要评估自己团队消化新技术的能力。4. 实际用起来之前先把这几件事想清楚如果看完上面的分析你还是想试试 Positorium 或类似的多模数据库我建议按照下面的流程走一遍。4.1 明确你的核心场景是什么先问自己为什么要选多模数据库是因为数据确实跨多种模型还是只是因为觉得听起来很高级如果业务数据里根本没有复杂的图关系那图模型的能力就是浪费。如果分析场景很少列存能力也用不上。多模数据库的价值只有在数据模型确实多样性时才体现得出来。我的判断标准很简单关系模型能覆盖 80% 以上的核心业务逻辑。图关系用于辅助层级关系或关联分析。列存用于少量统计报表。键值用于缓存或配置。只有当四种需求同时存在且跨模型查询频繁才值得考虑多模数据库。4.2 设计好数据模型的统一映射使用多模数据库前最重要的工作不是写代码而是设计好同一份数据在不同模型下的映射关系。一个简单的框架是定义顶点类型哪些表对应图中的顶点。定义边类型哪些外键关系对应图中的边。定义列式投影哪些字段组合需要建列存视图。定义键值访问路径哪些场景用主键直接读。这步没做好多模就只是一层壳底层还是当普通关系库用既没发挥优势还增加了理解成本。4.3 小数据量验证不要一上来就全量迁移迁移到一个新数据库最忌讳全量搬家。建议先拿一个模块、一张业务表、一小段真实数据做试点。验证顺序可以是建表、插入数据、查数据确认基本能力可用。在图模型下通过外键关系构建一条查询路径。在列式投影上跑一个聚合查询观察速度。用主键走一遍键值读取确认低延迟路径。同时跑这几种查询看资源占用和稳定性。模拟异常情况比如中断写入、杀进程重启观察数据恢复能力。每步都记录日志和耗时再决定要不要扩大范围。4.4 准备一套基础运维方案数据库再先进也逃不过运维。至少要确认数据文件如何备份、如何恢复。是否有日志机制能追踪查询和写入。是否有权限控制避免越权访问。是否支持导出和导入方便迁移。是否有监控指标比如内存、磁盘、连接数。如果这些都没有那它更适合当教学工具而不是业务组件。5. 从学习角度这类项目能教会你什么即使不把它用在生产环境Positorium 这类项目也是很好的学习材料。它可以帮你理解数据库设计里几个核心问题。5.1 存储引擎和查询引擎的边界在哪里很多初学者会把存储引擎和查询引擎混为一谈。实际上存储引擎负责数据怎么落盘、怎么组织、怎么建索引查询引擎负责解析 SQL、生成执行计划、调用存储引擎接口。多模数据库之所以难是因为它不仅要做好这两层还要在不同查询语义之间做翻译。比如图遍历和关系查询可能在执行计划层面有本质差异但最终都要落到同一套存储接口上。看懂一个多模数据库你就能理解存储引擎的上限决定查询引擎的上限这个道理。5.2 元数据设计决定了多模能力的天花板一个数据库要支持多种数据模型元数据设计至关重要。它需要知道某张表是关系表也同时是图里的顶点集合某个字段是普通列也是图里边的属性某个投影是列存索引服务分析查询。这些信息不会写在业务数据里而是写在系统表里。系统表的设计直接决定了逻辑层能否灵活表达多种模型。如果你以后自己设计中间件、数据平台或低代码系统的数据层这套元数据设计思路完全可以借鉴。5.3 多模不是银弹它是对复杂度的再分配最后要建立一个正确的认知多模数据库不是把复杂度消灭了而是把复杂度从多个系统的集成转移到了一个系统内部的模型翻译。在传统多库架构里复杂度在运维层和应用层在多模数据库里复杂度在存储引擎和执行优化器层。对于使用者来说接口更简单了对于数据库实现者来说工作量和难度反而更高。这也是为什么真正成熟的多模数据库很少见因为做一个能同时处理好四种模型的存储引擎难度远超单独做四个引擎。6. 如果继续跟下去值得重点看的几个方向最后给一些观察方向方便你持续跟踪 Positorium 或同类项目。6.1 看它怎么解决跨模型查询优化一个数据库如果在多模方面做到 80 分通常会在跨模型查询优化上有独到设计。比如图遍历和 SQL 过滤能否融合成一个执行计划列存投影能否被图遍历复用键值访问能否作为热点路径的加速器。这些点决定天花板。6.2 看它的存储模型是否真的统一有些项目说是多模实际就是包了一层查询接口底层还是多个引擎。真正有技术含量的是底层物理存储是否真正统一能否做到一份数据、多种视图、无损切换。这会直接影响数据一致性和查询性能。6.3 看它的迁移导入工具链是否完善一个数据库能不能被实际使用迁移工具链往往比查询能力更重要。如果它能把 MySQL、PostgreSQL 的数据自动迁移成自己的多模模型那落地成本会低很多。如果只能手写导入脚本那理性选择是用成熟数据库 应用层适配。6.4 看社区和版本迭代速度数据库项目能不能活下去社区活跃度是关键。看 release 频率、issue 回复速度、文档完整度、有没有真实用户案例。这些信息比项目画的大饼更能反映真实状态。最后说一个我自己的判断多模数据库这个概念在业界已经存在很多年但真正让它变得可行的不是概念本身而是底层存储引擎和查询优化器的成熟度在不断提高。Positorium 把 RDBMS、图、列存、键值四种能力放在同一个项目里不管这个项目最终能不能成为主流至少它把一个问题摆在了桌面上数据模型的割裂正在成为复杂应用架构里的隐性成本。如果你现在正面临多库架构带来的同步和一致性问题可以多关注这类项目但如果你只是想找个数据库把业务跑起来我更建议用成熟稳定的数据库然后在应用层解决多模诉求。工具会迭代但先想清楚数据模型再选存储方案这个原则不会变。
返回列表