日期:2014-05-19  浏览次数:20570 次

诸如职务,职称,学历这类信息,当存到员工档案表中时,是存名称好呀,还是建一个对照表,在员工信息表中存编码呀。
诸如职务,职称,学历这类信息,当存到员工档案表中时,是存名称好呀,还是建一个对照表,在员工信息表中存编码呀。
------------------
比如存名称,比较好设计:
结构如:
编号,姓名,职务,职称,学历
001,张三,科长,工程师,大本
002,王二,处长,技师,中专

比如存编码,设计复杂些。先要建对照表:以学历对照表举例
学历对照表:
01,中专
02,大专
03,大本
则上面表如下显示(这里只将学历字段显示)
编号,姓名,职务,职称,学历
001,张三,XX,XX,03
002,王二,XX,XX,01

不知以上设计思路,哪种更好些。
规范的设计原则是什么?

------解决方案--------------------
对照表好点
------解决方案--------------------
如果员工档案表数据量不大,可以建名称,
如果数据量巨大,建议采对照表方法
------解决方案--------------------
映射表最好!
------解决方案--------------------
個人建議用對照表
------解决方案--------------------
看到很多商用软件,其实好多类似信息也是不存编码的,直接存名称.即不建楼主所说的对照表
------解决方案--------------------
个人倾向于怎么简单怎么来。毕竟现在服务器性能在多数情况下已不需要在这方面去斤斤计较了。
------解决方案--------------------
第一种方法便捷,简单,直接存名称,保存、查询起来相对方面。
缺点:如果职务中的“科长”根据客户的需要要改为“主管”,那操作人员需要对每一条记录进行修改保存,如果数据量大的话,呵呵,有的改了。

第二种用对照表,每次查询都要 JOIN每个对照表,比较累点,但是可以解决第一种建立的视图的缺点。
------解决方案--------------------
数量少,建议用参照表,这样用户输入也方便,点下鼠标就行了。
------解决方案--------------------
如果数据量是百万级的建议这样用(曾经参加过一个百万级的项目):
用对照表 但实际一个对照表就足够了
例:t_user表 username,usersexid,userpostid
张三 0 0
李四 1 1
t_code表 id(自增序列)flag(类型) codeid(具体类型值) meaning(含义)
0 1 0 男
1 1 1 女
2 2 0 科长
3 2 1 处长

在sql 2000 中编写一个函数

--根据类型值和codeid得到 相应的中文含义
CREATE FUNCTION F_GetMeaning
(
@flagid nvarchar(30),
@CodeID nvarchar(30)
)
RETURNS varchar(500)AS
BEGIN
DECLARE @Result varchar(1000)
SET @Result = ' '
SELECT @Result = meaning from t_code where flag= @flagid and codeid = @CodeID
RETURN @Result
END

查询语句:select username as 姓名,dbo.F_GetMeaning(1,usersexid) as 性别,dbo.F_GetMeaning(2,userpostid) as 职位 from t_user
查询结果:姓名 性别 职位
张三 男 科长
李四 女 处长

这样写有个好处就是 即使以后科长改成主任了 你只需要改t_code表就可以了。



------解决方案--------------------
查询语句:select username as 姓名,dbo.F_GetMeaning(1,usersexid) as 性别,dbo.F_GetMeaning(2,userpostid) as 职位 from t_user
查询结果:姓名 性别 职位
张三 男 科长
李四 女 处长

这样写有个好处就是 即使以后科长改成主任了 你只需要改t_code表就可以了。
-----------------------
这样写的好处是代码简洁,不用进行多次连接操作了.可是不知这样做的效率如何?
我觉得这样可能效率会比较低,不知楼上朋友如何看,呵.

------解决方案--------------------
对照表好些...以后加新元素..或改也方便
------解决方案--------------------
看来大我建义用对照表,可是这样的话,每次查询时都要进行若干次连接操作呀,如:
select a.编号,a.姓名,a.学历编码,b.学历名称,a.职称编码,c.职称名称,a.职务编码,d.职务名称
from 员工表 a left join 学历表 b on (a.学历编码=b.学业历编码)
left join 职称表 c on(a.职称编码=c.职称编码)
left join 职务表 d on (a.职务编码=d.职务编码)

大家看,仅显示三个字段就要连接三个对照表呀。如果表中有几十个字段就要连接几十个对照表呀。
所以总觉得这种设计还是有问题的。大家请指教。

===========================================