数据库建表规范建议

时间:2022-11-27 08:19:25

代码review若干建议

1.    数据库建表

参考《MySQL性能调优与架构设计》这本书。

1.1 统一使用支持事务处理的InnoDB存储引擎,字符编码utf-8,编码核对utf8_general_ci

1.2 表间关系尽量不要用id主键关联,例如订单与会员管理,可以用会员的唯一编号。

数据库迁移的时候可能会丢失id主键。

1.3 适当的建立索引。索引建立技巧参考书籍或baidu

1.4 适当的冗余字段,根据产品需求做冗余,如果有多个字段需要冗余,建议不要冗余了,一般冗余另外一张表的1~2个字段,哪些些字段可冗余,下面表的案例有些字段冗余多了。

1.5 范式和反范式权衡使用,有些数据需要作为快照

1.6 表是有主次之分的。例如订单,会建一张主要的订单信息表,相关业务都是围绕这个表扩展的,例如选品,支付,退货……一系列可扩展。到了支付系统里面,又会建立支付流水这张主表,其他的附加信息可以扩展。

1.7 表中数据不要存null这样的值,null处理麻烦事多,搞不好还会大大的影响性能,建议可以为null的值转换成not null default ‘’ 。

1.8 必要的唯一约束,唯一约束就是唯一索引。

1.9 表名命名:业务名称_表名称[_功能]。

例如,线下订单:off_order 线下订单项:off_order_item

表主键id的注释必须说明表的注释.例如:线下订单表主键id

Powerdesigner工具只做表间关系图。不作为最终的sql生成器。

手动把sql写好。

CREATE TABLE `off_order` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`order_no` varchar(50) NOT NULL COMMENT '订单编号',
`order_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单类型;1.零售,2批发',
`member_mobile` varchar(50) NOT NULL DEFAULT '' COMMENT '会员手机号码',
`member_no` varchar(50) NOT NULL DEFAULT '' COMMENT '会员卡号',
`member_name` varchar(50) NOT NULL DEFAULT '' COMMENT '会员姓名',
`store_no` varchar(50) NOT NULL DEFAULT '' COMMENT '网点编号',
`store_name` varchar(50) NOT NULL DEFAULT '' COMMENT '网点名称',
`store_mobile` varchar(50) NOT NULL DEFAULT '' COMMENT '网点联系手机号码',
`store_contact` varchar(50) NOT NULL DEFAULT '' COMMENT '网点联系人姓名',
`area_name` varchar(50) NOT NULL DEFAULT '' COMMENT '县域名称',
`area_addr` varchar(50) NOT NULL DEFAULT '' COMMENT '县域地址',
`order_amount` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额',
`pay_way` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单支付方式,1。现金支付; 2.会员卡支付;3.会员现金支付',
`pay_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单支付状态:0未支付;1支付中;2支付成功;3支付失败',
`terminal_serial` varchar(50) NOT NULL DEFAULT '' COMMENT '终端机序列号',
`create_user_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建用户Id',
`create_datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '订单创建时间',
`STATUS` tinyint(4) NOT NULL DEFAULT '0' COMMENT '记录状态,0,有效订单;1。订单已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `order_no` (`order_no`)
) ENGINE=InnoDB AUTO_INCREMENT=23195 DEFAULT CHARSET=utf8

1. 数据库字段说明:_time代表后缀 *代码匹配合适的文字

字段

字段名称

数据库类型

Java类型

注释

主键

id

Bigint

Long

线下订单主键id

订单编号

order_no

Varchar(可变长度)

String

订单编号

时间

_time

timestamp

Date

时间,日期(都是用这个类型,其他类型不合适)

类型

_type

tinyint

Integer

*类型。1.批发,2零售(类型要枚举)

状态

_status

tinyint

Integer

*状态。1.已支付,2未支付(状态要枚举)

标记

delete_mark

bit

Boolean

记录是否已删除。

金额

_ amount

decimal(8,2)

bigdecimal

*金额。

价格

_ price

decimal(8,2)

BigDecimal

*价格

线下:off 线上:online 订单:order 商品:good 记录:record 明细:detail

金额:amount 支付:payment 状态:status 类型:type 图片地址:img_url

区域:area 行政区:district 活动:activity 账户:account  sku 销售:Sales

供应商:supplier 品牌:brand 平台:platform 种类:Category

规格:specification 网点店铺:store 广告:ad 用户:user 子项:item

库存:Stock 退货:Refund 操作:operation 时间time 编码:code

父级:parent 子级:sub 主:main 主键:id 编号:no 历史: history

价格:price 原始:original 实际:reality 卖家:seller 买家:buyer

代理:agent 省province 市city 县county 区district    地址address

发货:send 创建:create 收货:receive 标志:mark 备注remark

2. 代码编辑

去复习一下java基础的书籍,写代码可以写先写简单的中文步骤或代码流程图,这些步骤最后就是最好的注释,这样写代码我相信就算只写一半,第二天再来写都不会忘记。养成好的代码习惯非常重要。

1、码面向对象的思想。读代码都一块一块读的,快速定位。命名百度一下,有最佳命名方案的。

2、controller层接收参数,进行参数校验,然后把参数直接给service层处理。不要太多的逻辑处理,命名与业务相关,与service对应,接口url量采用restful,全部小写支持restful风格。

3、service逻辑处理的关键,每个service都应该对应良好的单元测试。方便别人和自己调试你的接口,命名与业务相关。

4、Dao要基本不需要涉及到业务逻辑。命名也基本不与业务相关。

6、变量命令写全一点,一般一个对象也就在一个业务里面用一次而已,都是简写,相当于把代码做了混淆。

5、码后要junit测试,调试,调整代码。对自己写的代码多做review。