化验室信息系统数据库设计-请教

adamzzww 2010-11-17 03:39:10
准备对一个化验室信息系统做数据库设计,这方面一点不懂,求教大家:
需求如下:
一个样品,需经过多组检测,每组检测不同的项目;
不同种类的样品,部分组别检测的项目相同,部分组别检测的项目不相同;
目前设计方案两种如下:

方案一:
样品基本信息表 组别1检测 组别2检测 组别3检测 组别4检测
--样品名称 ---项目1 ---项目31 ---项目51 ...
--样品种类 ---项目2 ---项目32 ---项目52
--采样时间 ---项目3 ---项目33 ---项目53
--等等 ..... ...... ....
---项目30 ---项目50 --项目60
这种设计,每组的检测项目是最大化的,有些样品可能只检测其中7,8种项目。


方案二:
样品类别1 样品类别2 样品类别3 样品类别4
---项目1 ---项目1 ---项目1
---项目2 ---项目2 ---项目2
---项目3 ---项目3 ---项目3
--- ... ...
--项目40
这种设计,不同的样品类别会造成很多检测项目是相同的,是否太过冗余了。


求教:相对来说哪种方案合适点,或者有更好的设计方案,便于存储查询和今后的扩展(比如多增

加一个检测项目)?谢谢大家。
...全文
224 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
adamzzww 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 unearth 的回复:]
不要用存储表了,你这样,无疑就是增加了查询时间。你可以用视图将几个表连接起来,插入数据,你可以用SQL Server2K的触发,
[/Quote]
查询用视图,好建议,不过这样存储还是担心中间表太过庞大,估计要还做转换表;
插入数据,如何用触发器?
感觉还是方案一简便,就是浪费空间。。
孤独de猫 2010-11-18
  • 打赏
  • 举报
回复
不要用存储表了,你这样,无疑就是增加了查询时间。你可以用视图将几个表连接起来,插入数据,你可以用SQL Server2K的触发,
adamzzww 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 abclikeabc 的回复:]
不登录能回贴吗?
[/Quote]
谢谢详细回帖,也谢谢大家的意见。有些疑问还是不懂:

样品种类表:
1 种类1
2 种类2

样品表:
1 1 种类1 样品1
2 2 种类2 样品2


检测项目表:(100项)
1 检验项目1
2 检验项目2
3 检验项目3
...
100 检验项目100

中间表:
id kindid testid 值
1 1 1 10
2 1 2 20
3 1 3 30
4 2 1 11
5 2 3 12

结果表:(如果存在)
id Result SampleID KINDID
1 10 1 1
2 20 1 1
3 30 1 1

我知道一个多对多关系,一般转换为两个一对多来处理,主要是样品种类,样品,检测项目的关系。(检测项目是分组的,其中有两组检测项目固定,其余根据样品类别有所变化)
疑问:
1. 如果采用结果表,一个样品检测过后,如何将值存储到结果表中,好像也查询不出什么检测项目?

2.值直接存储在中间表中,一个样品检测项目估计有40个左右,如何插入值?这样查询起来有没有问题?

3.一个样品的所有检测项目,对应范围都要有所限制,如设定上下限之类,这个表又如何设计,和哪些需要关联?如下
检测数据范围表:
样品名 检测项目 上限 下限
样品1 项目1 100 1
样品2 项目2 200 2
adamzzww 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 liiu83724 的回复:]
用触发器也可以,写在软件里也可以
[/Quote]
能说清楚点么,插入中间表的时候,我做什么动作引发触发器产生哪个动作?
liiu83724 2010-11-18
  • 打赏
  • 举报
回复
用触发器也可以,写在软件里也可以
adamzzww 2010-11-18
  • 打赏
  • 举报
回复
晚上结贴吧,感谢大家的帮忙。分少,不好意思了。
还是不知道如何设计比较好,郁闷。有好想法的希望站内消息我。。
abclikeabc 2010-11-17
  • 打赏
  • 举报
回复
1、样品表(Sample)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Sample]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Sample]
GO

CREATE TABLE [dbo].[Sample] (
[id] [int] NOT NULL ,
[TypeId] [int] NULL ,
[SampleName] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

2、样品种类表(Kinds)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SampleType]') and OBJECTPROPERTY(id, N'IsUserTable') =

1)
drop table [dbo].[SampleType]
GO

CREATE TABLE [dbo].[SampleType] (
[id] [int] NOT NULL ,
[TypeName] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

3、检测项目表(TestItems)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestItems]') and OBJECTPROPERTY(id, N'IsUserTable') =

1)
drop table [dbo].[TestItems]
GO

CREATE TABLE [dbo].[TestItems] (
[id] [int] NOT NULL ,
[TestName] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

4、取样人表(SampleOfPeople)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SampleOfPeople]') and OBJECTPROPERTY(id,

N'IsUserTable') = 1)
drop table [dbo].[SampleOfPeople]
GO

CREATE TABLE [dbo].[SampleOfPeople] (
[id] [int] NULL ,
[name] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

5、样品种类——检测项目表(Kind_Test)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Kind_Test]') and OBJECTPROPERTY(id, N'IsUserTable') =

1)
drop table [dbo].[Kind_Test]
GO

CREATE TABLE [dbo].[Kind_Test] (
[KindID] [int] NOT NULL ,
[TestID] [int] NOT NULL
) ON [PRIMARY]
GO


6、检测结果表(TestResults)(重点)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestResults]') and OBJECTPROPERTY(id, N'IsUserTable') =

1)
drop table [dbo].[TestResults]
GO

CREATE TABLE [dbo].[TestResults] (
[ID] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SampleId] [int] NOT NULL ,
[PeopleId] [int] NOT NULL ,
[KindId] [int] NOT NULL ,
[Result] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

关于最终检测结果的显示调用:
在网上找一下数据表的行列转换方法,对表TestResults进行行列转换就可以实现了。如果感觉转换速度太慢,可以考虑做个表专门存贮转换后的结果。

PS:上面发了条垃圾信息,不好意思。
abclikeabc 2010-11-17
  • 打赏
  • 举报
回复
不登录能回贴吗?
孤独de猫 2010-11-17
  • 打赏
  • 举报
回复
不变动,或变动比较少的放在一个表中。
变化比较大的再建一个表,然后关联。
lyhoo163 2010-11-17
  • 打赏
  • 举报
回复
请参考在关技术书籍:一是,表中的字段,最好不要重复。 二是,每个表设一个不重复ID。三是,每个表之间建立关联。
xeqtrl982 2010-11-17
  • 打赏
  • 举报
回复
样品表
项目表
样品项目关系表
haitao 2010-11-17
  • 打赏
  • 举报
回复
品检测值、检测时间 肯定是在 样品-检测项目关联表 了
adamzzww 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sz_haitao 的回复:]
如果 检测项目 是固定的

样品表
检测项目表
样品-检测项目关联表
[/Quote]
对单一的样品来说,不同样品的检测项目是不同(不固定)的。
对同一种类的样品来说,检测项目是相同(固定)的。
设计是这样的?:
样品表
--样品编号(主)
--样品种类(外)
--采样人
---等等
样品检测项目表
--项目id
--项目名称
样品-检测项目关联表
--id
--项目id
--样品种类

那样品检测值,放哪里?样品表里面?

haitao 2010-11-17
  • 打赏
  • 举报
回复
如果 检测项目 是固定的

样品表
检测项目表
样品-检测项目关联表
adamzzww 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sz_haitao 的回复:]
一个样品表
一个样品检测项目表

主从关系
[/Quote]
您说的是如下这样设计的么?
样品表
--样品编号(主)
--样品种类
--采样人
---等等

样品检测项目表(这个如何设计?但每一类样品检测项目是不同的,忽略样品种类,不同的检测项目估计有一百种)
--检测项目ID(主)
--样品编号(外)
--样品种类
--项目1
--项目2
---------
--项目100(这样设计,检测值直接存储在这张表中?)

还是通过样品种类来关联(即第二种方案)?
haitao 2010-11-17
  • 打赏
  • 举报
回复
一个样品表
一个样品检测项目表

主从关系
adamzzww 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gobiz 的回复:]
请参考:

数据库设计第一范式
数据库设计第二范式
数据库设计第三范式
...
[/Quote]
谢谢,不过这个..理论了吧,有没有实例可以借鉴的。

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧