为什么要引入字典表和实例表
首先我们来看一个小例子,来理解为什么要引入字典表和实例表?
情景一:假如你在玩一个游戏,突然爆了一件十分稀有的武器,假如开发者设计的表是这样的:
table inst_equip(
id,
userId,
装备名称,
装备图片,
装备属性,
...);
这样看起来不会有什么问题,只需要在inst_equip表中加入一条记录就好。
接着我们来看下一个情景。情景二:如果这件装备突然被系统赠送给10000名玩家,那么问题就来了...
数据库的inst_equip表在添加记录时需要将这件装备的信息重复添加10000次。
然而这并不是致命的,如果系统觉得这件装备太bug了,要修改它的某个字段,那么这10000条inst_equip表的记录每条都要进行同样的修改...
解决方案
于是游戏开发者决定将装备的信息从equip表中抽离出来,建立
table dict_equip(
id,
装备名称,
装备图片,
装备属性,
...
);
这样的话,inst_equip表就变成了这样:
table inst_equip(
id,
userId,
equipId, //游戏字典表的ID
...
);
好处
这样的话,如果需要对装备属性进行修改的话,就只需要对dict_equip记录的一条记录进行修改。有点像JAVA中的组合。
什么是字典表和实例表
说了这么多,那么什么是字典表和实例表呢?
字典表:简单来说就是用户的各种操作不会对其记录产生影响(增删改),它存放一些与用户不相关的信息。如:dict_equip(装备字典表)
实例表:反之,实例表则是与用户的信息息息相关的一些信息。如:(inst_equip)玩家装备实例表
思考
这样分表有什么好处呢?
(1)首先,逻辑上看着更加清晰,因为系统是为用户服务的,所以建表分成与用户相关的表(实例表),与用户不相关的表(字典表);
(2)其次,就是上面说到的便于字典表数据的维护(增删改操作);
(3)再者,查询数字的效率要比查询字符串高,且存储空间更小(字符串重复的存储会造成空间的浪费);
(3)最后,就是减少了数据库中数据的冗余。满足第三范式的要求。