为更方便的查询数据库,UJCMS设计了查询解析器。要使用这个查询解析器,数据库表名、字段名必须符合一定的命名规范。同时代码生成器对数据库字段类型也有一定的要求。
以下规范皆为强制性要求,如有不符的地方,可能导致系统运行异常。
表名一律使用小写字母
在Windows下默认安装MySQL,会忽略大小写,把所有大写表名自动变成小写表名。而Linux下MySQL区分大小写,这会导致从Windows导出数据往Linux迁移时,出现表名大小写不一致的情况,导致找不到表。而其它一些数据库如Oracle,会在任何时候把小写表名自动转成大写,不存在兼容性问题。
表名必须以ujcms为前缀
如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类型。
布尔类型(boolean)
布尔字段一律使用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。例如:
varchar(450)->@Length(max = 150)varchar(90)->@Length(max = 30)varchar(30)->@Length(max = 10)varchar(10)->@Length(max = 10)varchar(15)->@Length(max = 15)varchar(3)->@Length(max = 3)varchar(12)->@Length(max = 12)varchar(255)->@Length(max = 255)

