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


枚举,一种数据类型(相对于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。


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

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



本文出自 “傻帽” 博客,请务必保留此出处http://hotboy.blog.51cto.com/8826994/1640321

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。