数据库对象设计及使用规范
说明:
本小节红字部分的内容为用户 “必须” 遵循的行为。
其余内容仅供参考,只是 “推荐” 用户做的内容,并不 “强制” 用户必须遵循。大家根据真实业务需求决定是否采取这些建议即可。
对象名定义规范
各种对象的命名规范就不再老生常谈了,无非就是名字长度不要超级长,要能够望文生义,表示出特定的对象类型以及对应的业务含义等等,例如 tbl_student_id。大家的命名风格都有所不同,个人觉得没有所谓的正确和错误,也没必要强行统一。
这里只建议大家:除非有特殊原因,尽量不要使用特殊字符或者关键字作为对象名。原因是看着别扭,用着更别扭,纯属自己给自己找别扭。
之前见过有个别的用户给表命名为: table(保留关键字),给列命名为: `(表示转义的特殊字符)。看着就跟加密过似的。自己人用着舒不舒服暂且不提,如果出了问题,技术支持同学排查起来也要吐上几升血。
obclient [test]> create table `table` (```` int);
Query OK, 0 rows affected (0.050 sec)
obclient [test]> insert into `table` values(123);
Query OK, 1 row affected (0.007 sec)
obclient [test]> select ```` from `table`;
+------+
| ` |
+------+
| 123 |
+------+
1 row in set (0.000 sec)
因为各种对象名 rename 都很方便,所以这部分就直接略过了。
tenant(租户)使用规范
租户的概念可以类比为 MySQL 的一个实例,概念详见这个教程的《租户背景知识》小节。
禁止在生产环境中使用 sys 租户存放用户数据!需要创建新的用户租户来使用!
sys 租户是被设计用来存放其他用户租户元信息的租户,不提供完整的数据库功能,误用可能会带来严重后果!
database(库)使用规范
禁止在生产环境中使用 information_schema、oceanbase 等系统自带元数据库来存放用户数据。误用可能会带来严重后果!
obclient [test]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| obproxy |
| oceanbase |
| test |
+--------------------+
5 rows in set (0.007 sec)
table(表)设计规范
为了建立出冗余更小、结构更合理的表,在进行数据库创建的时候要遵循一定的原则,在关系型数据库中这种规范被称为范式。请大家先自行了解数据库的三大范式。
-
表结构设计应该在三大范式思想的基础上,以业务性能为指导,适当进行数据冗余存储,以减少表的关联从而提升业务性能。冗余字段应遵循:
-
不是频繁修改的字段。
-
不是超长的字符串类型字段。
-
-
建表时应该设定主键。
-
建议使用业务字段做主键或做联合主键,不建议使用自增列做主键。
-
OceanBase 数据库的表存储模型为索引聚集表模型(
IOT
),如果用户未指定主键,系统会自动生成一个隐藏主键。
-
-
表、字段建议有
COMMENT
属性。 -
表中字段如果需要保证非空,建议显式指定
NOT NULL
属性 -
表中建议根据需要定义
DEFAULT
值。 -
不同表中的相同列,尽量保证列定义完全一致,避免在计算时产生不必要的隐式转换。
-
进行
join
的关联字段,数据类型保证一致,避免在计算时产生不必要的隐式转换。除了数据类型,还要关注 collation、precision、scale 等数据类型的附属属性,这里属性不同很容易会造成索引失效、计划不优等问题。
column(列)设计规范
-
建议在创建自增列字段时使用 bigint 类型。如果使用 int 类型,则容易达到 max value。
-
建议根据业务需求,选择合适的字符串长度、以及数字的 precision、scale。可以节约存储空间,并能够提升查询性能。
-
对不同类型的列进行比较时,会发生隐式类型转换。隐式类型转换时,由标准 SQL 定义的转换方向大致是:字符串类型 -> 数字类型 -> 时间类型。为了明确业务真实需要的类型转换方向,以及为了充分利用索引加速查询,建议在比较前,使用 cast 或 convert 等方式来进行显式类型转换。