Files
srdb/examples/new_types
bourdon 77087d36c6 功能:增强 Schema 系统和添加新示例
- 扩展 Schema 支持更多数据类型(Duration、URL、JSON 等)
- 优化 SSTable 编码解码性能
- 添加多个新示例程序:
  - all_types: 展示所有支持的数据类型
  - new_types: 演示新增类型的使用
  - struct_tags: 展示结构体标签功能
  - time_duration: 时间和持续时间处理示例
- 完善测试用例和文档
- 优化代码结构和错误处理
2025-10-10 02:57:36 +08:00
..

SRDB 新类型系统示例

本示例展示 SRDB 最新的类型系统特性,包括新增的 ByteRuneDecimal 类型以及 Nullable 支持。

新增特性

1. Byte 类型 (FieldTypeByte)

  • 用途: 存储 0-255 范围的小整数
  • 适用场景: HTTP 状态码、标志位、小范围枚举值
  • 优势: 仅占 1 字节,相比 int64 节省 87.5% 空间

2. Rune 类型 (FieldTypeRune)

  • 用途: 存储单个 Unicode 字符
  • 适用场景: 等级标识S/A/B/C、单字符代码、Unicode 字符
  • 优势: 语义清晰,支持所有 Unicode 字符

3. Decimal 类型 (FieldTypeDecimal)

  • 用途: 高精度十进制数值
  • 适用场景: 金融计算、科学计算、需要精确数值的场景
  • 优势: 无精度损失,避免浮点数误差
  • 实现: 使用 github.com/shopspring/decimal

4. Nullable 支持

  • 用途: 允许字段值为 NULL
  • 适用场景: 可选字段、区分"未填写"和"空值"
  • 使用: 在 Field 定义中设置 Nullable: true

完整类型系统

SRDB 现在支持 17 种数据类型:

类别 类型 说明
有符号整数 int, int8, int16, int32, int64 5 种
无符号整数 uint, uint8, uint16, uint32, uint64 5 种
浮点 float32, float64 2 种
字符串 string 1 种
布尔 bool 1 种
特殊类型 byte, rune, decimal 3 种

运行示例

cd examples/new_types
go run main.go

示例说明

示例 1: Byte 类型API 日志)

演示使用 byte 类型存储 HTTP 状态码,节省存储空间。

{Name: "status_code", Type: srdb.FieldTypeByte, Comment: "HTTP 状态码"}

示例 2: Rune 类型(用户等级)

演示使用 rune 类型存储等级字符S/A/B/C/D

{Name: "level", Type: srdb.FieldTypeRune, Comment: "等级字符"}

示例 3: Decimal 类型(金融交易)

演示使用 decimal 类型进行精确的金融计算。

{Name: "amount", Type: srdb.FieldTypeDecimal, Comment: "交易金额(高精度)"}

// 使用示例
amount := decimal.NewFromFloat(1234.56789012345)
fee := decimal.NewFromFloat(1.23)
total := amount.Add(fee) // 精确加法,无误差

示例 4: Nullable 支持(用户资料)

演示可选字段的使用,允许某些字段为 NULL。

{Name: "email", Type: srdb.FieldTypeString, Nullable: true, Comment: "邮箱(可选)"}

// 插入数据时可以为 nil
{"username": "Bob", "email": nil} // email 为 NULL

示例 5: 完整类型系统

演示所有 17 种类型在同一个表中的使用。

类型优势对比

场景 旧方案 新方案 优势
HTTP 状态码 int64 (8 字节) byte (1 字节) 节省 87.5% 空间
等级标识 string ("S") rune ('S') 更精确的语义
金融金额 float64 (有误差) decimal (无误差) 精确计算
可选字段 空字符串 "" NULL 区分未填写和空值

注意事项

  1. Byte 和 Rune 的底层类型

    • byte 在 Go 中等同于 uint8
    • rune 在 Go 中等同于 int32
    • 但在 SRDB Schema 中作为独立类型,语义更清晰
  2. Decimal 的使用

    • 需要导入 github.com/shopspring/decimal
    • 创建方式:decimal.NewFromFloat(), decimal.NewFromString(), decimal.NewFromInt()
    • 运算方法:Add(), Sub(), Mul(), Div()
  3. Nullable 的使用

    • NULL 值在 Go 中表示为 nil
    • 读取时需要检查值是否存在且不为 nil
    • 非 Nullable 字段不允许为 NULL会在验证时报错

最佳实践

  1. 选择合适的类型

    • 使用最小的整数类型来节省空间(如 uint8 而非 int64
    • 金融计算必须使用 decimal避免 float64
    • 可选字段使用 Nullable而非空字符串或特殊值
  2. 性能优化

    • 小整数类型byte, int8, uint16可减少存储和传输开销
    • 索引字段选择合适的类型(如 byte 类型的索引比 string 更高效)
  3. 数据完整性

    • 必填字段设置 Nullable: false
    • 使用类型系统保证数据正确性
    • Decimal 类型保证金融数据精确性