为更方便的查询数据库,UJCMS设计了查询解析器。要使用这个查询解析器,数据库表名、字段名必须符合一定的命名规范。同时代码生成器对数据库字段类型也有一定的要求。
以下规范皆为强制性要求,如有不符的地方,可能导致系统运行异常。
在Windows下默认安装MySQL,会忽略大小写,把所有大写表名自动变成小写表名。而Linux下MySQL区分大小写,这会导致从Windows导出数据往Linux迁移时,出现表名大小写不一致的情况,导致找不到表。而其它一些数据库如Oracle,会在任何时候把小写表名自动转成大写,不存在兼容性问题。
如ujcms_article
ujcms_user
等。
为避免和数据库中其它表重名,或与系统表、关键字冲突,表名必须使用一个前缀。
为方便代码生成,以及查询解析,统一使用ujcms作为前缀。
表名多个单词必须以下划线分割,不可用大小写作为分割。
如ujcms_message_board
ujcms_article_ext
等。
如id_
name_
description_
。
如name_
description_
。
可避免和数据库关键字冲突。也是JPA(Hibernate)生成字段别名时的规则。
如publish_date_
字段名多个单词必须以下划线分割,不可用大小写作为分割。
除多对多关联表外,一律使用名为id_
的字段作为主键,该字段不能有任何业务含义,字段类型为的int
或bigint
类型(根据预期的数据量选择)。
多对多关联表,一般用关系双方的表名加_id_
组成,如用户表ujcms_user
与角色表ujcms_role
的多对多关联表ujcms_user_role
,里面的联合主键一般为user_id_
和role_id_
。
某些情况下,多对多关联表的联合主键也可以不按照表名加_id_
的方式。如栏目表ujcms_channel
的闭包表ujcms_channel_tree
,由于联合主键里的两个字段均是ujcms_channel
的外键,因此可以更灵活的定义联合主键字段的名称,如ancestor_id_
和descendant_id_
。需要注意的是,依然必须以_id_
结尾。
外键一般使用外键表名加_id_
的结构,如文章表ujcms_article
关联栏目表ujcms_channel
,外键字段一般为channel_id_
。
在对一个外键表,却有多个关联字段时,可以更灵活的定义字段名,如文章表ujcms_article
有多个字段关联用户表ujcms_user
,创建用户字段为user_id_
,修改用户字段为modified_user_id_
。
不管如何,外键字段名称必须以_id_
结尾。
在一个字段有固定的几个取值时,用枚举类型。如状态(0:已发布,1:已归档,5:待发布,10:草稿,11:待审核,12:审核中,20:已删除,21:已下线,22:已退回)。
数据库中,枚举类型一律使用smallint
字段类型;Java实体类的枚举字段使用Short
类型。
布尔字段一律使用char(1)类型。'1'
为true
,'0'
为false
,不能为空null
,并给默认值。
布尔字段不能为null
,如需为null
,考虑使用枚举类型。如性别,取值为m
f
null
,则应该考虑使用枚举,0:保密,1:男,2:女。
非布尔类型字段不能使用char(1)
字段类型。如特殊情况下,一定要用一个字符的数据类型,可以使用varchar(1)
。
布尔字段不能使用is
作为前缀。如enabled_
不能为is_enabled_
,否则生成的实体类代码的属性名为isEndabled
,而get
set
方法则变成了getIsEnabled
setIsEnabled
。
日期类型在Java里映射为OffsetDateTime。如果数据库支持带时区的日期类型,应该首选带时区的日期类型,否则用常规的日期类型。
Oracle的varchar2最长支持4000字节,按三个字节一个汉字计算,大概可以支持1200个汉字。所以一般超过1000个汉字的字符串,就用Clob(或MySQL的text)。
数据库的字符长度,有些以字节为单位,有些按字符为单位。为了跨数据库平台,字符串长度一律以字节为单位。
而某些字段只保存英文,无需考虑中文问题。因此在代码生成时,能够被3整除且个位为0的长度,会判定认用于存储中文,映射成java属性时,最大长度限制会除以3。例如: