V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noobma
V2EX  ›  程序员

大佬帮我看看这个表设计

  •  
  •   noobma · 2021-01-06 21:56:28 +08:00 · 3454 次点击
    这是一个创建于 1417 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    次卡表

    id 次数

    储值卡表

    id 金额

    用户会员卡表

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

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

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

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

    要么储值业务直接融到会员卡表(储值会员卡表,一张解决问题)
    要么就做外键关联,Redis 缓存你需要冗余的高频字段
    fansfans
        9
    fansfans  
       2021-01-07 09:17:28 +08:00
    用户会员表不要存储次数和金额吧 万一一个用户两张表咋整
    hyqCrystal
        10
    hyqCrystal  
       2021-01-07 09:22:26 +08:00
    我咋觉得一张表就行了勒 有何缺点吗
    shanghai1943
        11
    shanghai1943  
       2021-01-07 09:48:15 +08:00
    我觉得应该是一张卡表和一张用户和卡的关系表就可以了。
    卡表:id type 金额 次数;
    关系表: user_id, card_id, card_type, 剩余金额,剩余次数
    JohnH
        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...

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

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

    要不然你每更新一次卡的信息,就要锁住两个表写。
    wozhizui
        15
    wozhizui  
       2021-01-07 12:33:14 +08:00
    不符合 [第二范式] 来着?剩余次数和剩余金额和其他表相关了,可以计算出来的列,不应该存到用户的数据表中。
    比如一个自然人的信息表 person,可以存姓名,出生日期等,但是不应该存年龄,因为年龄是根据出生日期算出来的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2694 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.