大佬帮我看看这个表设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
noobma
V2EX    程序员

大佬帮我看看这个表设计

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

    现在要做会员卡功能,有 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
    nullempty ‘,大表里少了些状态字段。其他类型不用加字段了吧,直接绑定类型就行了吧。我也不懂
    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     Solana     5808 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:25 PVG 10:25 LAX 18:25 JFK 21:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86