
现在要做会员卡功能,有 2 种会员卡,次卡、储值卡,下面是我的设计
次卡表
| id | 次数 |
|---|
储值卡表
| id | 金额 |
|---|
用户会员卡表
| user_id | 会员卡 id | 卡类型 | 剩余次数 | 剩余金额 |
|---|
我想着查询的时候方便,就把 剩余次数 和 剩余金额 放到用户会员卡表里面了,要是次卡 剩余金额 就为null,要是储值卡 剩余次数 就为null,以后如果要再加一个其他类型的会员卡,那我这个用户会员卡表可能又得加字段。
大佬们帮我看看这样合理吗?比较常见的做法是什么样的
1 kaka6 2021-01-06 22:02:26 +08:00 纯用关系表的话,正常就是这样设计 想要更灵活组合下 nosql |
2 tesguest123 2021-01-06 22:05:04 +08:00 via iPhone nullempty ‘,大表里少了些状态字段。其他类型不用加字段了吧,直接绑定类型就行了吧。我也不懂 |
3 cmdOptionKana 2021-01-06 22:35:03 +08:00 via Android 就不要剩余次数 和 剩余金额了吧,主要是方便不了多少。甚至可以说更麻烦了,因为要维护这两个数字与另外两个表的一致性。 |
4 mkfs 2021-01-06 23:53:20 +08:00 为什么我觉得用户会员卡表可以不要。 卡表里面各自加一列 user_id,要获取一个用户的各种卡,到各个表里面各一个简单 SELECT 就好了。 如果实在是想一个查询得出用户会员卡表这种格式,用 UNION ALL 。 |
5 medivh 2021-01-07 02:46:03 +08:00 1. 表应该有数据无关的主键,考虑日后多对多的扩展性; 2. 应该记录消费记录,而每条消费记录都需要时间戳、操作人员这类的信息,一定会用得到; 3. 多考虑一些业务上的幺蛾子需求,比如说用户需要在两种卡之间转换之类的,会对你的表结构带来什么影响; 4. 给主表加上删除标记(或者直接用一个 bitmask 做可扩展状态标记),创建时间,更新时间等扩展列; |
6 justfun 2021-01-07 07:12:21 +08:00 via iPhone 你这样设计不科学 。建议了解一下数据库设计范式 https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html |
7 netnr 2021-01-07 08:56:03 +08:00 via Android 范式冗余 ,别太精炼 |
8 uiosun 2021-01-07 08:57:20 +08:00 你这储值业务的字段,冗余到会员卡表的意义何在? 要么储值业务直接融到会员卡表(储值会员卡表,一张解决问题) 要么就做外键关联,Redis 缓存你需要冗余的高频字段 |
9 fansfans 2021-01-07 09:17:28 +08:00 用户会员表不要存储次数和金额吧 万一一个用户两张表咋整 |
10 hyqCrystal 2021-01-07 09:22:26 +08:00 我咋觉得一张表就行了勒 有何缺点吗 |
11 shanghai1943 2021-01-07 09:48:15 +08:00 我觉得应该是一张卡表和一张用户和卡的关系表就可以了。 卡表:id type 金额 次数; 关系表: user_id, card_id, card_type, 剩余金额,剩余次数 |
12 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... 把所有卡混在一个表里了,会员获得一张或多张卡,消费时选择某种卡来消费 |
13 JohnH 2021-01-07 10:01:46 +08:00 跟楼上如出一辙[汗] |
14 yzbythesea 2021-01-07 10:23:57 +08:00 用户会员卡表里只有 user_id, 会员卡_id 次卡表 和 储蓄卡 表里分存 对应卡的所有信息 要不然你每更新一次卡的信息,就要锁住两个表写。 |
15 wozhizui 2021-01-07 12:33:14 +08:00 不符合 [第二范式] 来着?剩余次数和剩余金额和其他表相关了,可以计算出来的列,不应该存到用户的数据表中。 比如一个自然人的信息表 person,可以存姓名,出生日期等,但是不应该存年龄,因为年龄是根据出生日期算出来的。 |