数据库设计:关于枚举类型的表结构设计法,个人拙见

枚举,一种数据类型(相对于C#语言而言,当然,Java,PHP也有)、项目中使用枚举有以下一些优点。

第一:定义直观,使用方便、

第二:便于维护与扩展(实际上还是直观)

对于枚举类型的数据的显示,一般都是在程序里面定义这样一个枚举,然后通过程序获取枚举对应的

键名称,或者 DescriptionAttribute 标记,或者自定义 Attribute,在数据绑定的时候进行处理并

显示对应枚举值的描述信息或者键名称、(这会增加程序的运行成本与计算开销,个人拙见!!)

来看问题:

有一张订单表,单条数据表示一个订单基础信息,对订单的操作,需要对订单状态进行限制。

比如订单状态如下:

1:待处理,这个情况下允许仓库人员制单,生存包裹,做打包操作、

2:待配货,这个情况下允许仓库人员打印配货单,做捡货操作、

3:配货中,这个情况下允许仓库人员分拣订单物品、

4:待打包,这个情况允许仓库人员把分拣好的物品打包成一个包裹。

5:待称重,打包完成,允许仓库人员对包裹做发货前的包裹称重操作。

6:待发货,已经打包,并且称重完成,等待发货给客户、

7:已发货,已经发货了,监控包裹的物流信息

8:已签收,用户已经签收包裹(订单最后一步操作,标识订单完成。)

我现在要通过查询语句,直接显示,不调用任何的方法就显示对应枚举的键或者说明。

我是像以下这样子做的!

USE tempdb
GO

-- 创建订单表
CREATE TABLE Sys_Order(
    ID BIGINT IDENTITY(10000,1) PRIMARY KEY,
    [Status] INT NOT NULL,
    CreateDate Datetime NOT NULL DEFAULT(GETDATE())
)
GO

-- 创建枚举类型的
CREATE TABLE Basic_Enum_Type(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(20) NOT NULL,
    [LangID] INT NOT NULL,    -- 语言ID
    [Desc] NCHAR(150) NULL
)
GO

-- 枚举的字典表
CREATE TABLE Basic_Enum_Dict(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    [Key] BIGINT NOT NULL,
    TypeId INT NOT NULL,        -- 枚举类型,引用Basic_Enum_Type表的ID字段
    Name NVARCHAR(20) NOT NULL,
    [Desc] NCHAR(150) NULL
)
GO 
ALTER TABLE Basic_Enum_Dict ADD CONSTRAINT C_Unique_Key UNIQUE([Key])
GO

-- 初始化数据。
INSERT INTO  Basic_Enum_Type(Name,[LangID],[Desc]) VALUES(‘订单状态枚举‘,1,‘‘)

INSERT INTO 
 Basic_Enum_Dict([Key],TypeId,Name,[Desc])
SELECT 1,1,‘待处理‘,‘这个情况下允许仓库人员制单,生存包裹,做打包操作、‘ UNION ALL
SELECT 2,1,‘待配货‘,‘这个情况下允许仓库人员打印配货单,做捡货操作、‘ UNION ALL
SELECT 3,1,‘配货中‘,‘这个情况下允许仓库人员分拣订单物品、‘ UNION ALL
SELECT 4,1,‘待打包‘,‘这个情况下允许仓库人员制单,生存包裹,做打包操作、‘ UNION ALL
SELECT 5,1,‘待称重‘,‘允许仓库人员对包裹做发货前的包裹称重操作、‘ UNION ALL
SELECT 6,1,‘待发货‘,‘已经打包,并且称重完成,等待发货给客户、、‘ UNION ALL
SELECT 7,1,‘已发货‘,‘已经发货了,监控包裹的物流信息、‘ UNION ALL
SELECT 8,1,‘已签收‘,‘用户已经签收包裹(订单最后一步操作,标识订单完成。)、‘ 
 
 
INSERT INTO 
    Sys_Order([Status],CreateDate)
SELECT 1,GETDATE() UNION ALL
SELECT 1,GETDATE() UNION ALL
SELECT 1,GETDATE() UNION ALL
SELECT 1,GETDATE() UNION ALL
SELECT 1,GETDATE() UNION ALL
SELECT 1,GETDATE() 

GO
 -- 现在订单的查询,包括状态的查询。可以这样做了、写成如下SQL语句。

 SELECT
    _so.ID AS OrderID,
    ISNULL(_bed.Name,‘未知‘) AS StatusText
 FROM Sys_Order _so WITH(NOLOCK) LEFT JOIN Basic_Enum_Dict _bed 
 ON _bed.TypeID=1 AND _so.Status=_bed.[Key]

这样子做我个人感觉会有几个好处。

第一,枚举更直观,方便维护、

第二,查询显示,对于链表的查询。对于要程序计算显示,开销是会更小的。尤其是CPU。

脚本文件已经上传,有兴趣的朋友可以下载并查看附件。

个人的拙见,欢迎各位朋友,大师批评指出不足之处!!

时间: 2024-11-08 19:14:28

数据库设计:关于枚举类型的表结构设计法,个人拙见的相关文章

数据库设计02-数据类型

1.基本数据类型 file:///C:/Users/Administrator/AppData/Local/Skitch/屏幕截图_061315_105340_AM.jpg

基于Extjs的web表单设计器 第五节——数据库设计

这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计

数据库设计:表的设计命名的十个注意点

原文链接:http://www.cnblogs.com/netsql/archive/2010/05/04/1727323.html 1.表名一般以[模块名称_具体表名]来实现,同一个模块的前缀是一样的.(Oracle大小写敏感,在SQL中可以不用"_",因为可以用大小写一起的写法.这也是可以的) 2.表名称不应该取得太长(一般不超过三个英文单词,不推荐使用中文拼音,总的长度不要超过30个字符).表名使用英文的原因,有些项目有英文版的需要,或者这个项目是给外国做的时候,使用英文是基本的

使用NamedParameterJdbcTemplate向oracle插入枚举类型数据

使用NamedParameterJdbcTemplate向数据库插入含有枚举类型数据的对象时会出现的JAVA和SQL类型不匹配的情况,例如对于如下的JAVA类定义和对应的Oracle表定义: 1 public class MetaPhysicColumn { 2 3 public enum DataType{NUMBER, STRING, DATE, TIMESTAMP} 4 5 private String id; 6 private String name; 7 private String

数据库设计——评论回复功能

1.概述 评论功能已经成为APP和网站开发中的必备功能.本文主要介绍评论功能的数据库设计. 评论功能最主要的是发表评论和回复评论(删除功能在后台).评论功能的拓展功能体现有以下几方面: (1)单篇文章的评论数量和信息展示: (2)从时间维度,按照时间倒叙的方式展示动态的用户评论信息: (3)不同栏目,不同模块,不同时间维度的评论排行展示: (4)精华评论的单独推荐和聚合展示: (5)评论后直接分享到绑定的第三方平台: (6)点赞数.回复数等维度的排行等. 评论的后台管理: (1)删除: (2)推

数据库设计---入门

1.     数据库设计的概述 1.1.   数据库设计是什么 所谓的数据库设计就是根据需求文档的描述将需求转成数据库的存储结构的过程. 在数据库设计的流程上,我们通常根据需求,画出数据的ER图.然后在通过ER图生成数据库的建库脚本.(Entity Relational) ER图,所谓的ER图就是数据库关系图 为什么我们使用ER图来实现数据库设计的设计呢? 1.可见即可得.使用ER图可以通过图形的方式展示表与表直接的关系 2.可以根据设置的数据库,方便生成不同的数据库的SQL建库脚本 3.可以快

PHP和MySQL Web开发从新手到高手,第3天-数据库设计

这些表在以后会用到. 1. 数据库设计   包含如下6个表:   2. 每个表的结构 2.1 表`author` CREATE TABLE `author` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `password` char(32) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=

水果项目第1集-想法>需求->功能->数据库设计->类设计

懒,懒人,我是个懒人. 懒人想做点事,总是拖拖拉拉,迟迟没有开始. 很久很久以前,就想做属于自己的产品,但是至今还没有一个属于自己的产品. 两年前,终于想好,要做一个网上卖水果的系统,手机上点点,水果送到家. 一腔热血,但是困难重重!三大难题如下: 1.产品供应问题? 2.配送问题? 3.仓储问题? 卡住了,一个屁民,没那么多资本,能做这样的项目? 简直不可能,身边也没有土豪朋友,没人投资. 技术搞久了,人脉好像很单纯,身边没什么人有能力投资. 两年很快过去了,当然懒人什么也没做出来. Ok,今

Java自学-类和对象 枚举类型

枚举类型 步骤 1 : 预先定义的常量 枚举enum是一种特殊的类(还是类),使用枚举可以很方便的定义常量 比如设计一个枚举类型 季节,里面有4种常量 public enum Season { SPRING,SUMMER,AUTUMN,WINTER } 一个常用的场合就是switch语句中,使用枚举来进行判断 注:因为是常量,所以一般都是全大写 public class HelloWorld { public static void main(String[] args) { Season se