V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ashin
V2EX  ›  问与答

标签系统的数据库结构设计各位大佬有最佳实践方案吗?

  •  
  •   ashin · 2018-10-18 12:29:12 +08:00 · 1505 次点击
    这是一个创建于 2022 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求大概就是对一些资源可以打标签,可以通过资源查到所有标签,也可以通过标签查所有被标的资源。
    假设是千万级别的数据量的话,主要关注于查询性能。想到三种结构,不知道哪种好,本人数据库设计很业余,基础也不牢,希望大家指点一下。

    1 开始我想设计成这样:

    tag 表: `id`, `name`,`ref_count`

    resource 表: `id`, `name`, `obj`

    ref 表: `id`, `resource_id`, `tag_id`

    创建 tag 时`ref_count`为 0,表示引用的次数,然后通过 ref 表记录和 resource 表里面具体资源对象的关联关系。
    在 ref 表里面对`resource_id`, `tag_id`做索引。

    这样查询返回 name 的时候要去做关联,而且如果我 resource1 想把 tag1 的名字改一下,resource2 如果被 tag1 标了这样会影响 resource2 的 tag1 名字显示,修改起来显得麻烦。

    2 如果只用一张表存的话,比如:

    tag 表: `id`, `resource_obj`, `tagname`

    这样的话比较简单,更新 tag 操作比较麻烦

    3 搞两个表分别存对方的所有数据

    `resource_tags`表: `id`, `resource_obj`, `tagnames`

    `tag_resources`表:`id` `tagname`, `resource_objs`

    `resource_tags`里面直接把一个 resource 对象的所有 tag 名字都保存到 tagnames 字段,`tag_resources`直接把 tagname 关联的所有资源对象都反向保存下来。

    各位大佬有现成的最佳实践方案吗?求分享啊
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2321 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:54 · PVG 14:54 · LAX 23:54 · JFK 02:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.