数据表设计的一个小小疑问

李冰
  • 173

最近在看别人的项目,发现有的项目将用户表和用户余额表分开来创建

用户 -----> user 表
用户余额 ----> user_balance 表(里面包含了用户id和用户的余额数量)

741824-20160816002632156-637059328.png

但是有的人又将用户余额表和用户表创建为一张表

所以就懵逼了,不知道哪种更好一点??

分开来创建的话不是冗余了???
而且每次查询用户余额的时候先去用户表查询用户ID再去用户余额表查询余额 不是查询了两次 让数据库开销更大吗????

评论
阅读 1.9k
11 个回答

分开,为未来业务扩展做准备

建议是分开

主要是看自身业务要求形态,具体情况具体分析

分开好处:

  1. 不是用户表自身属性
  2. 分开,更容易控制金额的变化(尤其是分布式下)

余额最好是分开 如果把余额写在user表里 事实上隐患很大,而且在进行接口设计和开发的时候也会有很多额外工作量。
譬如说展示用户个人主页的时候,我们就需要对于公开页面 banlance信息进行移除。

这里应该要将banlance独立出来,我的做法是这样的,请参考:

user_account   核心账户 userid,username,password,nickname...
user_info      账户信息 userid,city,wxopenid,company...
user_pocket    钱包    userid,cash,points,type...
user_comment   评论 ...
user_collect   ...
user_like      ...
user_follow    ...

通过几个拆分反而可以有效控制单个表的空间大小优化查询效率,同时也降低了安全风险,何乐不为
查询的时候使用联表查询每次 1+1 , 1+2对于mysql来说是很轻松的事情

从领域模型来看,余额不是用户自身的属性,【用户】依赖【余额】,【余额】关联【用户】,所以分开存储更合理。如果因为余额的变更而引起用户信息改变,或删除用户后造成用户余额不可访问,这个听起来是有问题的。况且用户和余额可能分别有各自的状态。

这种设计方法,简而言之就是(用户简单信息表->用户详细信息表)这种模式分开。
如果写在了同一张表中:

优点:用户进入个人中心查询详细信息只需要一次查询而不是用户表连接查询。提高效率。
缺点:用户信息表字段过多,比如有20个用户信息字段,那么用户表就有20个字段。登陆注册的时候,只需要用户名和密码的,但是表过于大,会降低效率。

如果分开两张表:

优点:用户简单信息表,只保存用户id,用户名,密码,等必查项。对用户登录注册比较方便。毕竟详细信息不会每天都查。提高效率
缺点:查询详细信息的时候,需要表连接,降低效率。

以上这只是最浅显的分析,容易理解。更深层次的分析如何设计数据库,还需要更多的场景和业务需求

用户余额字段如果只有一个的话建议放在用户表,余额不是大字段,没必要拆分.
数据库设计的两个基本要求:

  1. 能实现需求
  2. 能保证性能
wance
  • 2
新手上路,请多包涵

看业务需求,余额并非用户属性,而是属于比较敏感的数据,分开比较好

范式和反范式都需要看业务需求。

这是一种取舍,余额如果特别重要,比如有些业务场景下和钱有关系,很敏感下,应该单独存放在扩展表里,如果仅仅是和user表内数据差不多的,那就放user表里好了,

拆开

拆开的同时保留用户表的数据作为缓存字段。余额表最近一条记录应该保存 用户id、发生时间、操作符号、产生金额、操作后结余金额,提高可靠性。
如果用户表的金额 和 操作表的对不上则说明存在异动。

顶楼上。。。

撰写回答

登录后参与交流、获取后续更新提醒

宣传栏