关于字典系统的设计,引用使用ID还是Value?

126 阅读2分钟

核心概念

  1. 字典类型 (DictType):  定义一组相关的字典项。例如:“性别”、“订单状态”、“用户角色”、“产品分类”。
  2. 字典项 (DictItem):  某个字典类型下的具体条目。例如,“性别”类型下有“男”、“女”、“未知”。每个字典项通常包含一个实际存储值(value)和一个显示标签(label)。

一、数据库设计

我们将设计两张核心表:

  1. dict_type (字典类型表)

    字段名类型约束/描述例子
    idBIGINT主键, 自增1
    type_codeVARCHAR(50)唯一键, 字典类型编码,供程序调用GENDER, ORDER_STATUS
    type_nameVARCHAR(100)字典类型名称,供展示性别, 订单状态
    descriptionVARCHAR(255)描述 (可选)
    is_systemBOOLEAN是否系统内置 (系统内置的通常不允许用户删除)true
    statusTINYINT状态 (0: 禁用, 1: 启用)1
    created_atTIMESTAMP创建时间
    updated_atTIMESTAMP更新时间
  2. dict_item (字典项表)

    字段名类型约束/描述例子
    idBIGINT主键, 自增101
    type_idBIGINT外键, 关联 dict_type.id1 (关联到 dict_type 的性别)
    type_codeVARCHAR(50)冗余字段, 关联 dict_type.type_code, 方便查询GENDER
    item_valueVARCHAR(100)字典项值 (实际存储在业务表中的值)MALE, FEMALE, 1, PROCESSING
    item_labelVARCHAR(100)字典项标签 (显示给用户看的值)男, 女, 启用, 处理中
    item_sortINT排序号 (值越小越靠前)1, 2
    css_classVARCHAR(50)CSS类名 (可选, 用于前端特殊样式)tag-red, status-success
    descriptionVARCHAR(255)描述 (可选)
    statusTINYINT状态 (0: 禁用, 1: 启用)1
    created_atTIMESTAMP创建时间
    updated_atTIMESTAMP更新时间

    二、其他表引用问题

    这里就存在一个问题,假设我有一张表,引用了不同的字典属性,这个是存id呢还是value呢?
    比如: 男、女; 身份证、健康证
    见过很多种设计:有存id和value的、存id的、存value的(若依)

    请问如果从id和value选一个方案,哪个更好?坑更少? 欢迎大佬们指教