技术

无 JOIN 的世界:博客数据建模规约

1 分钟2 条评论

Torchwood DocumentDB 没有外键,也没有跨集合 JOIN。本站的 categories 1:N postsposts M:N tags 用两个原语表达:

1:N:引用属性 + key 索引#

posts 上放 category_id(string,required),建 by_category key 索引。"某分类下的文章"两段式:先按 slug 查分类拿 id,再 eq("category_id", id)

M:N:数组属性(GIN 自动)#

posts 上放 tag_ids(string,array=true)。数组列的 GIN 索引由服务端自动创建——查询用 containsAny(交集非空)/containsAll(子集)。

contains 是 ILIKE 模糊匹配,不能用于数组成员判断。

删除协议#

服务端不会级联。删父文档前三步:

  1. countDocuments 检查引用数;
  2. 迁移 / 级联 / 拒绝,处置子文档;
  3. 删除父文档(带 OCC 版本)。

本站删除分类时执行的就是这个协议。

评论 2

登录后即可参与讨论。

  • ?
    匿名读者

    containsAny 和 contains 的区别这个坑太真实了,之前模糊匹配查数组查了一下午。

  • ?
    匿名读者

    删除协议那三步我们的项目也照抄了,孤儿数据确实少了很多。