这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。
需求大概就是对一些资源可以打标签,可以通过资源查到所有标签,也可以通过标签查所有被标的资源。
假设是千万级别的数据量的话,主要关注于查询性能。想到三种结构,不知道哪种好,本人数据库设计很业余,基础也不牢,希望大家指点一下。
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 关联的所有资源对象都反向保存下来。
各位大佬有现成的最佳实践方案吗?求分享啊