大佬帮我看看这个表设计

2021-01-06 21:56:28 +08:00
 noobma

现在要做会员卡功能,有 2 种会员卡,次卡、储值卡,下面是我的设计

次卡表

id 次数

储值卡表

id 金额

用户会员卡表

user_id 会员卡 id 卡类型 剩余次数 剩余金额

我想着查询的时候方便,就把 剩余次数剩余金额 放到用户会员卡表里面了,要是次卡 剩余金额 就为null,要是储值卡 剩余次数 就为null,以后如果要再加一个其他类型的会员卡,那我这个用户会员卡表可能又得加字段。

大佬们帮我看看这样合理吗?比较常见的做法是什么样的

3283 次点击
所在节点    程序员
15 条回复
kaka6
2021-01-06 22:02:26 +08:00
纯用关系表的话,正常就是这样设计
想要更灵活组合下 nosql
tesguest123
2021-01-06 22:05:04 +08:00
null—empty ‘,大表里少了些状态字段。其他类型不用加字段了吧,直接绑定类型就行了吧。我也不懂
cmdOptionKana
2021-01-06 22:35:03 +08:00
就不要剩余次数 和 剩余金额了吧,主要是方便不了多少。甚至可以说更麻烦了,因为要维护这两个数字与另外两个表的一致性。
mkfs
2021-01-06 23:53:20 +08:00
为什么我觉得用户会员卡表可以不要。
卡表里面各自加一列 user_id,要获取一个用户的各种卡,到各个表里面各一个简单 SELECT 就好了。
如果实在是想一个查询得出用户会员卡表这种格式,用 UNION ALL 。
medivh
2021-01-07 02:46:03 +08:00
1. 表应该有数据无关的主键,考虑日后多对多的扩展性;
2. 应该记录消费记录,而每条消费记录都需要时间戳、操作人员这类的信息,一定会用得到;
3. 多考虑一些业务上的幺蛾子需求,比如说用户需要在两种卡之间转换之类的,会对你的表结构带来什么影响;
4. 给主表加上删除标记(或者直接用一个 bitmask 做可扩展状态标记),创建时间,更新时间等扩展列;
justfun
2021-01-07 07:12:21 +08:00
你这样设计不科学 。建议了解一下数据库设计范式 https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
netnr
2021-01-07 08:56:03 +08:00
范式➕冗余 ,别太精炼
uiosun
2021-01-07 08:57:20 +08:00
你这储值业务的字段,冗余到会员卡表的意义何在?

要么储值业务直接融到会员卡表(储值会员卡表,一张解决问题)
要么就做外键关联,Redis 缓存你需要冗余的高频字段
fansfans
2021-01-07 09:17:28 +08:00
用户会员表不要存储次数和金额吧 万一一个用户两张表咋整
hyqCrystal
2021-01-07 09:22:26 +08:00
我咋觉得一张表就行了勒 有何缺点吗
shanghai1943
2021-01-07 09:48:15 +08:00
我觉得应该是一张卡表和一张用户和卡的关系表就可以了。
卡表:id type 金额 次数;
关系表: user_id, card_id, card_type, 剩余金额,剩余次数
JohnH
2021-01-07 10:00:38 +08:00
我有个类似形态的项目,设计表如下
- 会员表 users
...
- 卡类型表 cards
name,type[1:次卡,2:折扣卡],amount[总次数],money[总金额]
- 会员卡表 user_cards 一对多
user_id,card_id,card_type,amount[剩余次数],money[剩余金额],created_at...

把所有卡混在一个表里了,会员获得一张或多张卡,消费时选择某种卡来消费
JohnH
2021-01-07 10:01:46 +08:00
跟楼上如出一辙[汗]
yzbythesea
2021-01-07 10:23:57 +08:00
用户会员卡表里只有 user_id, 会员卡_id

次卡表 和 储蓄卡 表里分存 对应卡的所有信息

要不然你每更新一次卡的信息,就要锁住两个表写。
wozhizui
2021-01-07 12:33:14 +08:00
不符合 [第二范式] 来着?剩余次数和剩余金额和其他表相关了,可以计算出来的列,不应该存到用户的数据表中。
比如一个自然人的信息表 person,可以存姓名,出生日期等,但是不应该存年龄,因为年龄是根据出生日期算出来的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX