数据库设计-枚举字段的设计

数据库设计-枚举字段的设计,第1张

create table tb_name(type_id int,type_name varchar(50))

insert into tb_name values(1,'红色')

insert into tb_name values(2,'绿色')

insert into tb_name values(3,'**')

insert into tb_name values(4,'白色')

insert into tb_name values(5,'黑色')

格式是系统在显示此字段内容时的一种规范化效果, 和输入掩码配合来实现资料输入和输出时固定形式,

如 123456789。00 你你希望输出时 用分节符显示成 123'456'78900

就使用到格式了, 不需要在在输出时使用自定义函数来转换了

格式码应用于字段控件表达式中的所有字符但必须在格式码前面加上一个(@)符号。例如,你可以使用格式码字符串 "@L 999999" 为一个数值型的值填充一个前导的零来替代空格。

格式码: 描述: 应用到的数据类型:

!

强制文本大写。

仅字符型

B

左对齐。

所有类型

J

右对齐、

所有类型

I

居中。

所有类型

L

前导零。

仅数值型

Z

为零时置空。

数值,日期,日期时间型

(

用 () 括住负数。

仅数值型

C

正数后面加 " CR" 字符,零不加。

仅数值型

X

正数后面加 " DB" 字符,零不加。

仅数值型

$

使用货币符号。

仅数值型

D

使用当前的 SET DATE 设置。

所有类型

E

Display as if SET DATE BRITISH was in effect

所有类型

YL

使用系统长日期格式显示。

日期型

YS

使用系统短日期格式显示。

日期型

R

放置模板中的非格式码字符替换字段表达式值中的对应字符。当使用 @R 时,模板字符串使用插入方式替代覆盖方式。(参见下面的示例。)

字符和数值型

用户名 密码 真实姓名 电话 家庭地址 本人简介 varchar 长度50就好(家庭地址,本人简介 可适当加到:200)

性别 年龄 也可以是varchar 长度 4 就好 不适合用boolean (是否 作为性别的判断不太好,很少见)

性别如果用:0,1 替代用 int 长度 4

年龄 适合用int 长度 4

可以采用四种技术:

动态增加数据库表字段

预留足够的空白字段,运行时作动态影射

用xml格式保存在单字段里

改列为行,用另外一个表存放定制字段

现在我们来分析一下四种技术的优劣,不过首先可以排除的是第一点动态增加字段的方法,因为在实际 *** 作时候几乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不讨论就排除。剩下后三点。

先来讨论预留空白字段的方法,基本原理就是在数据库表设计的时候加入一些多余的字段,看下面的代码:

CREATE TABLE Sample(

name varchar(12),

field0 varchar(1),

field1 varchar(1),

fieldN varchar(1)

}

然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况:

public class Available

{

public int CurrentUnusedFieldNumber;

public Hashtable FieldToRealName;

}

也许某一时刻的数据状况是这样的: CurrentUnusedFieldNumber=3,

哈西表FieldToRealName包含内容是("field0"="SomeId", "field1"="AnyName",

"field2=IsOk")

现在的问题是如果要配合Hibernate,如何来处理?以上段的数据使用状况为例子,如果我们的类定义是这样:

public class Entity01

{

public string Name;

public string SomeId;

public string AnyName;

public bool IsOk;

}

也许只需要修改一下xxxhbmxml,把 SomeId 和 field0

做成对应就ok了。但是在运行时我们怎么知道会有这样的类定义?除非我们做动态代码生成,自动编译也许可以,但是问题也许就到其他方面去了;如果我们不用动态定义,那么类就只能是这样:

public class Entity01

{

public string Name;

public Hashtable ExtraFieldAndValues;

}

使用的时候,用 entity01ExtraFieldAndValuessetValue("AnyName", "boss")

的方式来引用,也许这样是修改最少的了,但是问题是Hibernate不支持这样的方法。

再来讨论单字段存储的方法,我们使用这样的数据库表定义

CREATE TABLE Sample

(

Name varchar(12),

Xml CLOB(102400) // 仅作说明而已

)

然后对应这样的类定义

public class Entity01

{

public string Name;

public string Xml;

public Hashtable ExtraNameAndValueFromXml;

}

我们的代码就可以这样使用:string id =

entity01ExtraNameAndValueFromXmlgetValue("SomeId")

了。这样解决看起来很不错,不仅不需要Available表,而且看起来Hibernate对它的支持也很完美,但是致命的问题在于:如果保持高效的查询?除非数据库系统本身对此有支持,否则就只能用低效的substring或者like做查询,这在大批量数据中根本就不可行。

是不是折衷一下,把两种方法的优点和起来?问题有来了:怎么保持两者之间数据的同步?难道要我们用存储过程去解析xml内容?

所以,一个两难的问题,需要我们认真去解决。我们通过认真的需求分析,也许可以减少可变字段的数量,但是只要有一个可变字段或者可变的可能性存在,我们始终要去解决这个两难的问题。

期待继续讨论。

还有一种方法就是改列为行,用另外一个表存放扩展字段,定义可以如下:

CREATE

TABLE SampleFields

(

idSample Integer,

fieldName varchar(30),

fieldValue varchar(100)

)

其中idSample关联到Sample表的id字段(我没有写出来)。这样的话,Hibernate很容易支持,也可以支持Sql的查询,而且可以支持把内容放到Hashtable中去,看起来是目前最好的方式了。但是在大容量数据的时候,SampleFields表的数据会是主表数据量的N倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。

以上就是关于数据库设计-枚举字段的设计全部的内容,包括:数据库设计-枚举字段的设计、vfp 设计数据库表的字段时,下面显示组框的“格式”是什么意思如图,都可以填什么,代表什么意思谢谢、帮我设计一下 mysql数据库的字段类型,再介绍下各个字段所对应实际数值的长度。谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9613978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存