
# 字段设计规范
- 【规则】字段设计应使用推荐类型。 字段设计需使用推荐字段，如果需要使用禁用、不推荐的字段类型。有些数据类型不推荐的原因是业务使用场景较少，未大规模商用。
  表1**数据库数据类型最佳实践** 
  | **数据类型** | **说明**                                              | **是否推荐** |
  |:---|:---|:---|
  | UUID     | 不同集群可能产生相同UUID                                      | 禁止       |
  | 序列整型     | 即自增列，包括SMALLSERIAL、SERIAL、BIGSERIAL                 | 禁止       |
  | 整数类型     | TINYINT、SMALLINT、INTEGER、BIGINT                     | 推荐       |
  | 任意精度类型   | NUMERIC/DECIMAL                                     | 推荐       |
  | 浮点类型     | REAL/FLOAT4、DOUBLE PRECISION/FLOAT8、FLOAT           | 推荐       |
  | 布尔类型     | BOOLEAN                                             | 推荐       |
  | 定长字符     | CHAR(n)                                             | 推荐       |
  | 变长字符     | VARCHAR(n)、NVARCHAR2(n)                             | 推荐       |
  | 变长字符     | TEXT/CLOB（字符大对象）                                    | 不推荐      |
  | 时间类型     | DATE、TIME、TIMESTAMP、SMALLDATETIME、INTERVAL、REALTIME | 推荐       |
  | 时间类型     | TIMETZ、TIMESTAMPTZ                                  | 不推荐      |
  | 二进制类型    | BYTEA（变长二进制类型）                                      | 推荐       |
  | 二进制类型    | BLOB（二进制大对象）、RAW（变长十六进制）                            | 不推荐      |
  | 位串类型     | BIT(n), VARBIT(n)                                   | 推荐       |
  | 特殊字符类型   | NAME、"CHAR"、通常供数据库系统内部使用                            | 不推荐      |
  | JSON类型   | JSON类型目前不支持操作符                                      | 不推荐      |
  | HLL数据类型  | 建议直接使用HLL相关函数，减少性能影响                                | 不推荐      |
  | 货币类型     | MONEY 存储带有固定小数精度的货币金额                               | 不推荐      |
  | 几何类型     | POINT、LSEG、BOX、PATH、POLYGON、CIRCLE                  | 不推荐      |
  | 网络地址类型   | 存储IPV4 MAC地址数据类型                                    | 不推荐      |
     
  
- 【规则】尽量使用高效的数值类数据类型。在满足业务精度的情况下，选择的优先级从高到低依次为整数、浮点数、NUMERIC。
- 【规则】合理设置数值字段的数据类型，根据取值范围选择合适的数值类型，尽量少用NUMERIC/DECIMAL类型。 NUMERIC和DECIMAL等价，NUMERIC/DECIMAL数据类型操作对CPU消耗较高。
  表2**数值类数据类型存储空间及取值范围** 
  | 类型                      | 存储空间 | 最小值                        | 最大值                       |
  |:---|:---|:---|:---|
  | TINYINT                 | 1    | 0                          | 255                       |
  | SMALLINT                | 2    | -32768                     | 32767                     |
  | INTEGER                 | 4    | -2,147,483,648             | 2,147,483,647             |
  | BIGINT                  | 8    | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
  | REAL/FLOAT4             | 4    | 6位十进制数字精度                                             ||
  | DOUBLE PRECISION/FLOAT8 | 8    | 15位十进制数字精度                                            ||
     
  
- 【规则】合理选用字符串数据类型。如果该字段输入确定为固定字符则使用定长字符类型，或需要自动补充空格，否则请使用变长字符类型VARCHAR。 典型的定长字段类型，例如"gender"字段，仅允许输入"f"或"m"一个字节长度的字符。这类字段建议使用定长数据类型（如CHAR(n)）。
  如果不存在此特点，或者后续可能扩展需要输入更长的字符，请优先使用变长字符类型（如VARCHAR, TEXT），且不建议指定变长类型的长度。
  原因如下：
  - 定长字段会对不够长度的输入数据补充空格，然后存入数据库中，产生不必要的存储空间浪费。
  
  - 如果定义为定长字符类型，后续扩展长度，需要对全表进行扫描重写，性能开销大，影响在线业务。
  
  - 对于指定固定长度的变长字段，每次插入时会检查是否长度越界，带来性能开销。
   
- 【规则】字符类型字段不应存储数字类型的数据。 如果对存储在字符类型字段中的数据进行数值计算，或者与数值进行比较操作（如置于过滤条件中），会带来不必要的数据类型转换的开销，同时该字段上的索引可能失效，影响查询性能。
  
- 【规则】字符类型字段不应存储时间或日期类数据。 如果对存储在字符类型字段中的数据与日期类数据进行计算或比较操作（如置于过滤条件中），会带来不必要的数据类型转换的开销，同时该字段上的索引可能失效，影响查询性能。
  
- 【规则】对于明确不存在NULL值的字段加上NOT NULL约束。 对于NOT NULL字段，优化器在某些场景下会进行特殊优化，可提升查询性能。
  
- 【规则】相关联字段的数据类型应保持一致。 在进行关联操作时，如果字段类型不一致，会带来数据类型转换开销。
  
- 【规则】大字段（例如varchar(1000)、varchar(4000)）不超过8个。
- 【建议】字段定义时建议同时创建COMMENT注释信息，以便于未来维护。 不同类型字段说明、取值范围及使用方法请参考[数据类型](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0320.html#ZH-CN_TOPIC_0000002200349766)章节。
  
- 【建议】当多个表存在逻辑关系时，表示同一含义的字段应该使用相同的数据类型。
- 【建议】对于字符串数据，建议使用变长字符串数据类型，并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数，避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串，否则，不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)。
- 【建议】用于WHERE条件过滤和关联的字段都应设置NOT NULL约束。 对于NOT NULL字段，优化器在某些场景下会进行特殊优化，可较大提升查询性能。
  
- 【建议】不建议对表预留字段。大部分场景下可支持快速新增、删除表字段，或者修改字段的DEFAULT值。 新增列必须符合以下要求，否则会带来全表更新开销，影响在线业务。
  1. 数据类型为以下类型中的一种：BOOLEAN、BYTEA、 SMALLINT、BIGINT、SMALLINT、INTEGER、NUMERIC、FLOAT、DOUBLE PRECISION、CHAR、VARCHAR、TEXT、TIMESTAMPTZ、TIMESTAMP、DATE、TIME、TIMETZ、INTERVAL。
  
  2. 新增列的DEFAULT值长度不超过128个字节。
  
  3. 新增列DEFAULT值不包含volatile函数。
  
  4. 新增列设置有DEFAULT值，且DEFAULT值不为NULL。
  
  
  如果不确定是否满足条件3，请联系GaussDB数据库技术人员进行评估。
  
 
