一.前言
结构化数据库的特点在于,需要事先严格定义好字段名,字段类型,长度,缺省值,取值范围,约束条件等,而且必须保证所有记录的所有字段都严格按结构设计来保存数据,否则不允许保存。关系型数据库在入库前进行了大量的检查和处理工作,如 SQL Server, Oracle, MySQL, PostgerSQL。
半结构化数据库则没有这些限制,可以较灵活地保存数据,入库时数据库本身不做严格检查,而是到客户端应用程序使用时,再检查数据的正确性和可用性,这样可极大提高数据的读写性能,如 MongoDB, Hbase ,Redis。
非结构化数据无明显的数据库结构可言,可作为一个整体数据进行保存,如文档,图像,音视频等。
Redis数据库是一个键值对数据库,提供了5种基本数据类型 (String, List, Hash, Set, ZSet),利用键名对数据内容进行保存和读取。Redis的业务处理逻辑,包含在键值的设计中,一般是利用实际的业务数据,动态拼装键名,来进行相关数据的保存和读取。因此客户端应用程序需要有一个统一的键值设计方案,才能有效实现相应的业务逻辑。
二.键名设计规则
本文提供了一种对Redis键名(没有包含值类型的设计)进行结构化设计的方案。键名的长度:可达512M, 但键名越长,越占资源,需要权衡
以下提供的命名项目,中间用冒号(:)分隔,其中(2,3,4,6)项是基本的,其他项目可以根据需要进行取舍使用。
序号 |
条目 |
说明 |
举例 |
1 |
实体族 |
也可理解为命令空间,Schema等 |
sys |
2 |
实体名 |
表名,包括系统表 |
user |
3 |
查询字段名 |
查找字段,或用于定位相关业务信息 缺省字段可以省略不写,如主键字段 |
userid |
4 |
查询字段值 |
具体业务内容,跟查询字段名对应 |
888 |
5 |
数据值对应的列族名 |
字段族,参考Hbase的结构设计 |
base |
6 |
数据值对应的列名 |
当前键要保存的数据值对应的数据列名 即当 【查询字段名】= 【查找字段值】时, 获得的内容对应的数据列名 |
username |
7 |
数据值的版本号 |
参考Hbase的结构设计,可保留值的多个版本信息 |
|
8 |
数据值的时间戳 |
参考Hbase的结构设计 |
|
三.举例说明
- 结构化数据库的表设计:
表名: user
序号 |
字段名 |
说明 |
1 |
userid |
用户id |
2 |
username |
用户名称 |
3 |
userole |
用户角色 |
4 |
password |
用户密码 |
5 |
isactive |
用户是否有效 |
表名: role
序号 |
字段名 |
说明 |
1 |
roleid |
关系型数据库的表物理主键,在Redis中,若没有引用,则可不要 |
2 |
rolename |
角色名称,固定值为 visitor, admin |
表名:loginlog :登录历史表
序号 |
字段名 |
说明 |
1 |
loginlogid |
关系型数据库的表物理主键,在Redis中,若没有引用,则可不要 |
2 |
userid |
用户名称 |
3 |
logintime |
登录时间 |
4 |
logouttime |
退出时间 |
表名:online :在线人员
序号 |
字段名 |
说明 |
1 |
onlineid |
关系型数据库的表物理主键,在Redis中,若没有引用,则可不要 |
2 |
userid |
用户id |
3 |
logintime |
登录时间 |
4 |
token |
令牌 |
- Redis 键名设计:
序号 |
键名设计 (包含的内容) |
举例 |
1 |
1:2:3:4:5:6:7:8 |
key = sys:user:userid:888:base:username:1:217453 value = username的值
说明:通过userid, 保存、读取 username 信息 |
2 |
2:3:4:6 实体名:查询字段名:字段值:列名 |
key = user:userid:888:username: value = username的值 说明:通过userid, 获得username
key = user:username:edwin:userid value = userid 说明:通过username 找到 userid |
3 |
2:4:6 实体名:字段值:列名 |
key = user:888:username (对应主键字段名为 userid) value = username的值
只适合主键字段(或每个实体的缺省字段),开发过程中应该非常明确,没有歧义 不建议根据数据类型来区别不同字段,代码容易混 |
4 |
2:4 实体名: 字段值 |
key = user:888 (对应缺省主键字段: userid) value = 跟当前userid 相关的值列表 |
5 |
2:3 实体名:字段名 |
key = online:userid value = userid列表
说明:所有在线用户的userid列表 |
6 |
2: 实体名: |
key = loginlog: value = 日志列表 |
7 |
扩展用法 |
结合多个列,甚至多个实体的组合键设计 |
- 特别说明
在redis 中,所有键名都是唯一的,且都在同一个物理结构级别,不分层级;但不同的键值,保存的业务信息各不相同,业务层级结构各不相同
- 保存整个数据库的系统信息
- 保存某个 entity的整体信息,
- 保存entity的一条记录;
- 保存entity的一条记录的一个字段的值
- 保存一对多的关系,
- 保存多对多的关系,等等