数据库设计思路
1问:创建数据库时需要指定字符编码吗? (1/2)
●答:不需要,建议在创建数据表时指定字符编码。
1、关于字符编码,可以在配置MySQL服务端、创建数据库时、创建数据表时指定,甚至在创建数据表的过程中为每个字段指定字符编码!
关于在各处指定的字符编码的优先级:字段>数据表>数据库>MySQL配置,例如,当数据库与数据表指定了不同的字符编码时,以数据表的字符编码为准。
2、通常,同一张表中的各字段的字符编码都是相同的,所以,一般不会在字段上指定字符编码,考虑到数据表及数据可能存在导入导出的需求,大多数导入导出都是以表作为基本单位,不是所有操作都以数据库为单位的,则在数据表上指定字符编码是更合适的做法。
问:为什么要分为多个数据库?
(1) 在微服务架构中,各微服务都是可以独立部署、运行的,类似多个完全不相关的项目(实则存在一定关联,甚至某些业务需要服务间调用才可以实现,但并不是所有业务都是这样),既然项目不相关,数据库不同也是合情合理的了;
(2)真实的项目的数据量会非常非常大,如果全部集中在同一个数据库中,很容易导致磁盘饱和,则可能需要频繁的进行分库、迁移数据等操作,数据库的维护成本较高,如果将数据库分开,可以使得维护相对简单一些,例如以_上介绍的mall_ ams就几乎不用担心数据量太大导致的磁盘饱和的问题;
(3) 分库更利于服务器资源分配,例如以.上划分了4个数据库,相对于mall_ pms、 mall_ oms而言,mall_ ams的读写频率肯定要低很多,那么,可以把更优质的服务器资源分配给mall_ pms、mall_ oms,而mall_ ams则不需要那么优质的资源,甚至在-定极端情况下(例如双11这种访问高访问频率的场景),可以关停mall_ ams的服务并把服务器资源临时分配到其它场景。
(4)优质的服务器资源=性能更好的服务器或更多服务器,如果某企业有许多台服务器,这些服务器大概率不是同-批采购的、性能相同的服务器,所以,服务器的性能肯定是有区别的,而且区别可能非常明显。
数据表设计规范
1、[强制]表达是与否概念的字段,必须使用is_ xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否)。
说明:任何字段如果为非负数,必须是unsigned(无符号)。
正例:表达逻辑删除的字段名is_ deleted, 1表示删除,0表示不删除。
2、[强制]表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
说明: MySQL在Windows' 下不区分大小写,但在Linux下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
正例: aliyun_ admin, rdc_ config, level3. _name
反例: AliyunAdmin, rdcConfig, level_ _3_ _name
3、[强制]表名不使用复数名词。
说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯。
4、[强制]禁用保留字,如desc、range、 match、 delayed等,请参考MySQL官方保留字。
5、【强制】主键索引名为pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_即 primary key;uk_即 unique key;idx_即 index 的简称。
6、[强制]小数类型为decimal,禁止使用float和double。
说明: float和double在 存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储。
7、[强制] varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
8、[强制]_表必备三字段: id, gmt_ .create, gmt_ modified。
说明:其中id必为主键,类型为unsigned bigint(对应Java类型为Long类型)、单表时自增、步长为1。gmt_ create, gmt_ odified的类型均为date_ .time类型,前者现在时表示主动创建,后者过去分词表示被动更新。
9、[推荐]库名与应用名称尽量一致。
10、[推荐]如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
11、[推荐]单表行数超过500万行或者单表容量超过2GB,才推荐进行分
库分表。
说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时
就分库分表。
12、【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:
(1) 不是频繁修改的字段。
(2) 不是varchar超长字段,更不能是text字段。
13、[参考]合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。