先说说业务背景。我们需要为一个大型园区设计停车场管理系统,核心功能包括车位管理、车辆进出记录、收费计算、会员管理以及每日对账。这可不是马路边上那种简单的停车,园区里有地上、地下、固定车位、临时车位,还有月租车、临时车、特殊车辆(比如消防车)之分,收费规则也分白天夜间、节假日,会员还能打折。需求文档厚厚一沓,第一眼看过去真有点头大。
一、核心表结构设计
白天首小时5元,之后每半小时2元,周末统一价10元每小时,单日封顶50元等等。计算费用时,程序需要根据入场时间、出场时间、车辆类型等条件匹配相应的规则进行分段计算。
5. 会员表 (member)
这里有个比较特别的设计:字段使用了JSON类型。因为一个会员可能绑定多辆车,如果用传统的一对多关系需要多一张表,这里考虑到查询性能和管理简便,直接用了JSON存储车牌数组。虽然查询效率稍受影响,但对于这种读多写少的场景是可以接受的。
二、一些设计心得与踩坑记录
索引不是越多越好。我们曾经在表建了十几个索引,后来发现写入性能下降严重。经过分析,去掉了几个选择性不高的索引,只保留最必要的。
历史数据归档。车辆记录表增长极快,我们计划按月分表,超过3个月的数据自动迁移到历史表,保证主表的查询效率。
字段冗余设计。在表中,我们冗余了和。虽然这些可以通过原始数据计算出来,但在账单查询和高并发场景下,用空间换时间是值得的。
枚举值管理。所有状态字段(如、)都在数据库文档中有明确定义,避免团队不同成员理解不一致。
字符集选择。统一使用,避免某些生僻字或emoji表情符无法存储的问题。
这次设计过程中,最纠结的就是收费规则那块。起初想设计得更灵活,支持任意复杂规则,但后来发现太复杂了反而难以维护和测试。最终采取了现在这种“有限度的灵活”方案,既满足了业务需求,又保证了系统的可维护性。
总之,数据库设计是个不断权衡的过程,没有完美的方案,只有最适合当前业务场景的方案。好的设计不仅要满足功能需求,更要考虑性能、扩展性和维护成本。每次设计都是一次学习,希望这次的经验对大家有所帮助。
6267

被折叠的 条评论
为什么被折叠?



