本文不讲具体的技术点,谈一点设计这也是在本次项目当中的一点心得体会。本文的一些观点主要是我平时的项目实践以及阅读和学习到,希望能够启发大家的思考,只有不断的思考才能不断的去领悟,他山之石可以攻玉,才会形成自己独特的理解并根据实际情况加以利用,形成自己的只是体系。主要是本次的项目部分的数据库的设计看的太蛋疼,所以写一写自己的感想。

一、账户体系:

账户体系:任何一个带有权限的多用户系统,账户体系都是必备的基础体系基础。我们这里将结合这个具体的来分析数据库的设计。
账户体系包含的内容

  • 用户常见的登录信息:

    • 用户名密码的组合 | 邮箱和密码的组合
    • openid 和电话的组合或者单独的 openId 的组合
    • qq进行登录的信息(这个没有做过不知道具体的标识是啥)
    • 指纹di
    • 其他生物信息
  • 用户的个人信息:
    • 用户类型
    • 电话
    • 会员等级
    • 积分总额
    • 已使用积分
    • 各种状态
    • 用户昵称
    • 用户创建时间
    • 用户图像
    • 密码的盐值
    • 推送的id标识
    • 来源(用户统计各个推广平台的转化率)
    • 邀请者 id
    • 用户总金额
    • 用户可用余额
    • 用户标签
    • 通知次数
      ……
      这是本次构建的系统的一部分的用户的信息,对!! 你没有听错,这只是一部分,上述我所提到的信息,全部在一张表内,当然登录的信息没有那么多,目前只有一个微信登录和用户名密码登录。

二、感想:

这个目前是我们公司设计的表,当然不是我设计的,不然也不会有这篇博文,多的咱就不提了,咱们下面就说一说该如何正确的拆分和设计。

2.1 数据库的设计原则(这个标题有点大,这里我只提我用到过的):

  • 符合三范式,非必须,因为有很多时候我们需要反三范式设计(后面再提)
  • 正确认识冗余
  • 中间表的设计
  • 防止数据库打补丁的原则:
    • 数据库表越少越好:实体是对客观世界的高度的抽象,只有抽象的够好,逻辑处理才会简单,各个实体的职责比较清晰,自然补丁就不会找你。
    • 数据库的字段个数合适:这里不说最少是最好的,因为很多情况我们必须要考虑冗余,这是为了我们查询更加的便捷,减少拼表提高效率,毕竟通常数据库做的大量的事情是查询。这里我们需要在 数据冗余 和 处理速度之间找到一个平衡点
    • 需要做好抽象工作,在这里我们依旧需要对设计模式原则有比较好的掌握(其实这也体现一点,有些原则是一通百通),
      • 例如:单一职责原则(例子我们会通过上面的案例来具体的分析)
      • 开闭原则:你可以在我上面扩展,但是拒绝修改,这个和上面的减少打补丁的原则一致
      • 迪米特法则:尽可能的减少和其他实体的发生相互作用,其实本质上还是单一职责的问题以及高度抽象的问题
    • OLTP 还是 OLAP
      • 前者关注事务、后者关注分析,对于事务型的我们往往会设计规范化的表,对于分析性的我们就会设计一个非规范化的表。
      • 对于事务型的我们更加关注并发,所以事务需要是轻量级的。对于分析性的我们往往会增加冗余毕竟去大量拼表。
      • 可能我们的系统中既有OLTP类型的也有OLAP类型的,一般公司比较小就不会划分这么细,那么具体的就具体的去分析,这里不用过多的考虑,一般这种情况很少出现,以前请教了一个支付宝的DBA,给我一顿鄙视(开个玩笑我的一个学长来的)他就说道这是你们公司自己垃圾设计的表都搞到一起了,一般公司都会有专门的数据仓库来处理

基本上我在设计数据库的时候会结合这些来考虑。有可能读者会看到,哎…… 这里并没有说怎么主键、外键、索引、视图、字段类型选择、约束性…… 呃,我只能说这些会在后面提升数据库性能的一章中提到。单一原则吗~~~

三、我们结合上面的来具体的设计一下表:

3.1、用户登录信息表

①:普通类型的

类型 长度 common
id unsigned int 11 primary key auto_incremetn
user_id unsigned int 11
phone varcher 15 这个长度为15的原因是防止要存储区号
pwd varcher 30 这个设计长一点因为一般都是混淆加密的
salt varcher 10

②:第三方登录的

类型 长度 common
id unsigned int 11 primary key auto_incremetn
user_id unsigned int 11
oauth_name varcher(40)
oauth_id varchar 40 一般第三方的OpendId 都比较长

3.2、个人信息表

类型 长度 common
user_id unsigned int 11 primary key auto_incremetn
phone varcher 15 这个地方就是冗余,因为登录表我们只做登录获取token,后续就不用了,但是电话号码我们需要做营销或者通知,所以还是添加到个人信息表里面,迪米特法则,尽量少与其他实体发生相互作用
nick_name varcher 30
birth datetime
img varcher 100 有的第三方图像巨长
user_from unsigned int 11 用户来源,用于统计推广的转化率

后面肯定还有具体的用户信息,我们就不在写了,这个表大多只是展示用的,只做查询之用。

3.3、用户账户表

类型 长度 common
user_id unsigned int 11 primary key
vip_level unsigned int 11 会员等级
discount decimal(3,2) 11 可享受的折扣,这个肯定也是别的表计算的结果,但是在这个地方依旧是冗余字段
total_score unsigned int 11 会员总消费积分
eff_score unsigned int 11 有效会员积分

这里也会有很多的具体的业务字段,这个大家根据具体业务具体的分析。

四、小结一下

数据库设计的如何直接决定整个应用程序的逻辑的复杂程度、稳定性。但是由于这个业务并不复杂,不可能将所有的原则技巧都使用上,只是看到我们的用户那部分的数据库设计比较糟糕,有感而发顺带总结一下数据设计的技巧。

上面主要用到了单一的设计原则,开闭原则,迪米特法则以及适当的冗余等。

ER图这个东西是没有具体的答案的,数据库设计的如何取决以下方面:

  • 你对整个业务流程的了解程序,因为设计表的时候你要考虑了到如何去查,把这个放到那一块才会减小不同实体间的相互作用
  • 你对数据库设计原则的理解程度
  • 你的经验:对于数据冗余和处理速度之间的平衡感
  • 你对有业务的抽象的能力
  • 细心程度投入程度,对于良好的设计的追求程度(你所看到的把所有的信息堆积到一起的,完全就是抱着一副完成任务的态度,这样说啥都是白扯)

今天的分享就到这里,接下来还有很多的欠账都没有补上,rabbitmq的内容是还没有写完的,我这里正在重新整理当中,因为后来我又重读了我的博客,我感觉还是没有讲清楚和讲明白,所以后面打算重写整个系列,有兴趣的请大家多关注一下。

用场景驱动的方式,讲述能看的懂能落地的技术。加入java技术进阶交流群(570980002)一起纯粹的讨论技术(非培训机构)。

博客首发地址csdn:https://blog.csdn.net/weixin_42849915
简书地址:https://www.jianshu.com/u/4b48be4cf59f
希望结识更多的大牛一同学习一同进步

转载于:https://www.cnblogs.com/fkxuexi/p/10674037.html

浅谈的数据库设计原则-之账户体系的分析相关推荐

  1. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  2. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  3. 关于密码的那些事儿—浅谈密码的设计与管理

    这是整理于2011年底的一份报告材料. 介绍1.背景 2011年底,国内遭遇网络安全的"崩盘".从CSDN用户数据被爆库,到天涯用户信息被刷库,到众多社交网站.论坛用户数据被拖库, ...

  4. 浅谈“领域驱动设计”

    Eric Evans所著的<领域驱动设计>(Domain-Driven Design:通常简称为"DDD")一书可以说是经典中的经典,虽然"领域"的 ...

  5. 数字化时代 需要利用计算机辅助,浅谈计算机辅助工业设计中的人机交互

    浅谈计算机辅助工业设计中的人机交互 论文关键词:工业设计 计算机辅助工业设计 人机交互 论文摘要:计算机辅助工业设计是工业设计未来的发展方向,本文从工业设计及计算机辅助工业设计的一般含义出发,探究计算 ...

  6. 管理中计算机系统的应用论文,浅谈计算机数据库的管理与应用论文

    浅谈计算机数据库的管理与应用论文 摘要:随着社会经济的快速发展,信息化网络技术手段不断进步,信息技术在人们日常生活.工作及学习中的广泛渗透,不仅给人们生活带来了极大便利,还极大的提升了人们工作与学习效 ...

  7. 数据库设计原则和优化

    数据库设计原则: 1. 原始单据与实体之间的关系  可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.  在特殊情况下,它们可能是一对多或多对一 ...

  8. 浅谈网络游戏的设计——服务器端编程

    浅谈网络游戏的设计--服务器端编程 本游戏服务器端操作系统采用UNIX,因为UNIX是标准的服务器操作系统,可保证网络游戏的稳定性.因此,以下所有的编程都将针对UNIX进行. 服务器端的整体构架如下: ...

  9. 浅谈时序数据库(TSDB)

    浅谈时序数据库(TSDB) 一.什么是时序数据库 二.时序数据库特点 基本特点 核心特性 三.补充知识 LSM树(LSM tree vs B tree) B tree LSM tree 总结 四.常见 ...

  10. 计算机辅助药物设计 中药,浅谈计算机辅助药物设计在中药研究中的应用(1).pdf...

    文档介绍: · 前沿进展· 浅谈计算机辅助药物设计在中药研究中的应用巴真真, 于巍巍摇摇作者单位: 圆缘远远园猿山东省滨州市,滨州职业学院医疗学院摇摇[摘要]摇计算机辅助药物设计( 悦粤阅阅)的理论和 ...

最新文章

  1. win7如何打开防火墙某个端口的tcp连接
  2. C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
  3. ADOQuery 的几个事件
  4. ubuntu16.04源码安装opencv3.4.0
  5. google annotation笔记
  6. 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc
  7. LeetCode 257. Binary Tree Paths (二叉树路径)
  8. c语言中char buffer,C语言对char*的封装,形成buffer
  9. scrollIntoView()窗口滚动
  10. Python 3.4中文编码
  11. 使用python修改微信支付宝运动步数
  12. 【HarmonyOS HiSpark IPC DIY Camera试用连载2 】一天内极速完成从开箱编译烧写到跑通hello world
  13. 查询中国天气网api需要用到的城市代码
  14. 【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
  15. pandas之链式索引问题(chained indexing)
  16. win10 支持ubuntu命令行的版本1607 产品密匙
  17. ipsec-***过程
  18. 2022 Java 知识点总结
  19. 这次,AMD又将数据中心标准提高了一大截
  20. 图像和图形(位图与矢量图)

热门文章

  1. 不要变得迟钝,努努力,什么都迎刃而解
  2. Together与Visual.Studio.NET的结合使用(一)
  3. Acrobat Pro DC 教程,如何编辑 PDF 文件中的文本和图片?
  4. 苹果Mac 3D 建模渲染软件:Vectorworks
  5. Theine for Mac(电脑休眠工具)
  6. 如何在Mac的内置词典中添加和删除单词
  7. Xshell设置密钥登录CentOS6.5_64位(图文版)
  8. FQDN(Fully qualified domain name)
  9. Material Design学习之 Dialog(顺便把前两天AppBarLayout没讲的部分提一提)
  10. pdflush进程详解