当前位置: 代码迷 >> Sql Server >> 关于数据库的设计有关问题
  详细解决方案

关于数据库的设计有关问题

热度:133   发布时间:2016-04-24 09:42:40.0
关于数据库的设计问题
我想做一个药品管理系统的数据库
它的药品分类是这样的



请问这种树形结构在应该如何创建数据库

我想了二个方案,请问大神们觉得哪种最好,或者有没有更好的方案

第一种方案:
分成四张表
第一张表是第一层分类,里面有西药、中成药、中草药
第二张表是第二层分类,里面有针剂、片剂、丸剂、散剂等等
第三张表是第三层分类,里面有大输液类、维生素类、抗菌类等等
第四张表是详细的药品信息表,里面有药品的名称、单位、规格、价格等等

第二种方案:
只有一张表
里面有药品的详细信息
也有分类编号

------解决思路----------------------
一张表比较好

Create Table medicine(
ID int NOT NULL,
MedicineName VARCHAR(50) NOT NULL,
MedicineCode VARCHAR(50) NOT NULL,
Ancestor int not null,
Remark varchar(200)
)


其中Ancstor = 0表示药物大类,下面语句查询大类对应的子类(层次递归)
select x.MedicineName BigClassName.y.* 
from medicine x,medicine y
where x.id=y.Ancestor and x.ancestor=0 and y.Ancestor>0

------解决思路----------------------
引用:
Quote: 引用:

一张表比较好

Create Table medicine(
ID int NOT NULL,
MedicineName VARCHAR(50) NOT NULL,
MedicineCode VARCHAR(50) NOT NULL,
Ancestor int not null,
Remark varchar(200)
)


其中Ancstor = 0表示药物大类,下面语句查询大类对应的子类(层次递归)
select x.MedicineName BigClassName.y.* 
from medicine x,medicine y
where x.id=y.Ancestor and x.ancestor=0 and y.Ancestor>0


那Ancestor等于其他值是什么含义  子类的名称怎么存?
另外Remark字段是什么意思

Ancestor是父节点ID值,Remark是备注字段

表数据
ID  MedicineName   MedicineCode  Ancestor
1    西药          00001              0
2    中药          00002              0
----------------------西药的子类别-------------
3    针剂          10000              1
4    片剂          10001              1
5    外用药        10002              1
....
------------------针剂细分-------------------------
6    大输液类      20000               3
6    止血类        20001               3
.....


懂了没?
------解决思路----------------------
第一种方案容易因为需求变更而大概,一般我会考虑使用第二种。
------解决思路----------------------
方案二改一下
药品明细一张表,外键为分类。
分类一张表,有父子关系。
------解决思路----------------------
同意楼上
然后,分类表上,最好维护出一个路径字段,很多处理效率都会好很多
  相关解决方案