SSDB如何设计数据库结构?
🕟 by pyList at 2016-09-07 15:53
比如SSDB如何建数据库名?如何分类?如何查询分页?如何条件筛选等?
简化数据模型
首先摆脱SQL 的经验,单从业务考虑,简化数据模型。
大部分设计用hashmap 和 zset 都能解决。
使用经验
- 我一般会一个应用(网站)用一个ssdb 实例,如果非得放在一个实例里就用前缀区分;
- 分类是一个hashmap 或 zset集;
- 分页根据游标,及hashmap 的key 或 zset 的 core 值;
- 条件筛选我一般不会考虑太复杂数据结构和多条件筛选,一般用索引字段为key,数据记录id 为值,精确get;
举个例子
文章的json 信息
{'title': 'test', 'id': 123, 'add_time': 1234567890, 'category_id': 1}
对应的数据结构:
// hashmap
db.hset('aticle', article_id, json_string)
// zset
db.zset('article_add_time', article_id, article_add_time) // 按发表时间索引
db.zset('category_article:' + category_id, article_id, article_add_time) // 分类索引
问题
目前有点点了解,但又有很多不清晰,比如“分页根据游标”就很难理解,另外一定有很多关于数据结构的设计技巧,既可以提升运维又能提高性能。比如:如何设计无限级分类?如何设计文章内容标签?如何设计商品自由扩展性属性(比如规格、款式、种类、尺寸、颜色、系列、适用等等)?如何设计数据结构的扩展性(从base到迭代更新)?
- 建议先熟悉ssdb 的数据结构,参考官方文档 http://ssdb.io/docs/zh_cn/php/index.html 11
name 的命名
关于name、key、value、score有哪些命名技巧,可否推荐一下。
ssdb 底层是leveldb,其特点是按key 排序,key 的命名其事也是为了更好的排序遍历。
ssdb 实现了 hashmap、zset 数据结构,其实在底层存储都是key - value 形式。
如 hashmap 的设置 db.hset('aticle', article_id, json_string)
是要经过某些转换 sum('aticle') + article_id后存储为key-value 形式。
再简单的例子
db.hset('aticle', article_id, json_string)
db.set('xxxx:aticle' +article_id, json_string)
上面第二行是经过一定转换后
得到的key。
回到原题,name 是为了方便建立数据集,类似于sql 的数据表,此时key 相当于sql 的主键;
hashmap 是根据key 值排序 zset 是根据score 值排序
本文网址: https://pylist.com/t/1473234834 (转载注明出处)
如果你有任何建议或疑问可以在下面 留言
发表第一条评论!
相关推荐
小工具
标签
ssdb
遍历
数据库
方法
合并
sqlite
索引
优化
知识
lua
sdk
推荐
两个
备份
导入
导出
数据
python
缓存
分享
一个
client
论坛
vps
内存
配置
全文
搜索
实现
cpu
debian
ubuntu
查看
温度
golang
正则
字符串
切割
硬件加速
ubnt
er
固件
路由
变砖
arris
ac1750
sbr
bbr
openwrt
开启
访问速度
加速
google
身份验证
authenticator
迁移
手机
静音
风扇
主机
笔记本
改造
之坑
files
open
服务
最新版
wndr4300
升级
默认值
struct
设置
html
中文
实体
转换
api
搜索引擎
网址
提交
自动
虚拟机
virtualbox
很慢
网络
解决
设计
结构
usb
上网卡
共享
自动更新
microsoft
mac
关闭
app
store
登录
未知
低功耗
web
爬虫
服务器
组装
微信
尝鲜
视频
体验
chrome
server
浏览
webdriver
微博
selenium
gnu
linux
安装
系统启动
编译
宅家
坑记
屏幕
动手
nginx
quic
抢先
useragent
蜘蛛
真假
识别
最近发表
- Mac 关闭 Microsoft 自动更新
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- 老笔记本改造为无风扇静音主机方案
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器
- 微信视频号尝鲜体验
- Ubuntu/Debian 查看CPU温度的方法
- 在Ubuntu/debian Server 系统使用Chrome 无头浏览模式
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- 使用Golang selenium WebDriver 自动登录微博
- 在 Ubuntu 或其它 GNU/Linux 系统下安装 Debian
- Mac 下制作 USB ubuntu/debian 系统启动、安装盘的几种方法
- ubuntu/debian 下自行编译 OpenWRT 固件
- 宅家自己动手换手机屏幕掉坑记
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- 在 Nginx 和 Golang web 上抢先体验 QUIC
- 从UserAgent识别搜索引擎并判断真假蜘蛛
最近浏览
- Ubuntu/Debian 查看CPU温度的方法
- Golang 正则切割字符串
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- ARRIS SBR-AC1750 路由变砖拆解折腾
- Openwrt 路由上开启BBR
- 开启BBR 加速小VPS访问速度
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- 老笔记本改造为无风扇静音主机方案
- Golang 服务之坑:too many open files
- WNDR4300 固件升级到 OpenWrt 最新版
- go struct 设置默认值
- 用python 实现中文与html实体相互转换
- 利用 API 自动向搜索引擎提交网址
- VirtualBox 虚拟机里网络很慢的解决方法
- SSDB如何设计数据库结构?
- Openwrt 使用USB 4G 上网卡共享网络