数据库设计-如何针对单个用户的链式数据设计数据库表结构?

项目合作 项目合作 主题:1030 回复:2135

数据库设计-如何针对单个用户的链式数据设计数据库表结构?

清晨说ぺ晚安 发布于 2017-09-11 字数 391 浏览 1257 回复 1

标题有点笼统,我举个例子来详述一下。

我这个项目是一个网络游戏,有一个保存玩家基础数据的table,包含id, 角色名,等级等数据。
每个用户只会有一个id,一个角色名,一个等级,所以映射到数据库的table就非常直观,
如果table名称是player_base的话,在SQLServer下大概就是这样:

create table player_base (id int, name nchar[32], level int)

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(1

夜无邪 2017-10-03 1 楼

我觉得在设计表的结构之前,必须明确你到底会进行哪些查询。
题目的例子举的并不好,如果查询某技能达到40级的人物,这个是非用户查询,是属于统计查询,针对统计查询要做额外的规划。
另外,如果你追求速度,就势必要牺牲一定的空间,你追求空间,也会牺牲速度,你必须选择一个倾向性。
像题目中的情况,你是查询需求,势必对速度有刚性需求,那么就不要计较空间的问题。

按技能来分析,它有如下特点

第一,查询技能只有单一用户才查,我不需要查询别人的技能,这一点不像装备
第二,技能只需要select与update,不需要delete,除非是天赋
第三,技能是一对多的关系
第四,技能可能出现多个级别并存的情况(如魔兽世界)

我们分析一下场景

1,select,显示我的全部技能,必选,不频繁,我查询一次,在客户端可以一直使用
2,显示我已经学会的技能,基于上面的记录
3,显示我可以学的技能,基于上面的记录
3,显示我还没学会的技能,基于上面的记录
4,insert 学习技能,必须,不频繁
5,update 升级技能,必须,不频繁

几种方案
1,集中型

user_id ,skill_1,skill_2,skill_3....N
skill的值 = 0 未学习 > 0 已学习,等级

select 每次记录数 1
insert 次数 1 ,操作记录数 1 初始化的时候需要,不需要重复insert
update 次数 N , 操作记录数 1

优点: 查询快,无需重复insert,update快
缺陷:扩展性低,添加新技能会成为问题。
2,分散型

uid , skill_id , level

select 每次记录数 N
insert 次数 N, 操作记录数 1
update 次数 N , 操作记录数 1

优点: 可扩展
缺点: 查询慢,需要insert

结论
从程序员角度你可能更认可集中型,但是从产品角度,我支持分散型方案,因为需求一直变化,尽管它查询慢,但事实上,查询并不频繁