数据库设计(急救)(100分)

  • 主题发起人 主题发起人 gutian
  • 开始时间 开始时间
G

gutian

Unregistered / Unconfirmed
GUEST, unregistred user!
我想设计一个材料库,材料有一个属性是类别,但是类别中含有大类、小类
我想用一个表记录类别,应该如何设计最好。如果有demo最好
 
大类:1
小类:0
 
用两个字段:类别、类别的类别(大类、小类)
 
用两个字段
有什么问题吗?
 
最简单了
新增列'类别'
用1或0,S或L区分都可以
 
意思是不是最后类别是树型结构?如果如此
ID,ParentId(两个字段) ID是自己的编号,ParentID是所属类别的编号,
最后取值的时候,递归就可以了。
 
对不起,各位大虾,我的意思是大类,小类中还有小小类,可能一直有好几个级的类别就是嵌套的类别。
 
to nose:
在程序中选择材料时,如何进行过滤和选择呢。能不能给出一个比较完整的解决方案。拜托各位了。此事比较急。如果能解决的话。价格好商量。必要的话我可以再加点钱
 
大类用00小类就是0000小小类就是000000写在一个库里就可以了
这是一个树
 
agree with nose.

 
材料很多吗?
如果不多,少于2000条(约数)
可以一次性读进列表,如TList 或自定义一个类。
过滤时,自己从列表处理
 
恐怕要多余两千条,因为小到螺丝都要进去,如果只是从编号上进行区分的话,要是
厂家的编号改变的话,不是数据统计就要出问题了吗
 
一个表记录类别
类别与材料是一个表吗?
如果是,建议不要那么做
 
类别与材料是分开的,只是类别是树型。难道都没有人遇到这样的问题吗
 
用两个表;
第一个表:PID1(编号),PID2(编号),PNUM(数量)
001 002 3
001 003 4
002 005 1
第二表:
PID(编号) PNAME(零件名称) ....

选择时采用递归查询.

这个方案是一家国外加工厂的方案,维护方便.


 
这很好办,利用表实现双链表的结构
如, Field1, Field2, Field3
Field1, Field3分别记录着材料类别的父与子,若没有就设为Null.
一切都解决了.
 
我的InterBase解决方案,请参考
/* Table MATERIAL_ID */
CREATE TABLE MATERIAL_ID (
MAT_ID VARCHAR(15) NOT NULL,
MAT_NAME VARCHAR(40) NOT NULL,
MAT_SEED SMALLINT DEFAULT 0 NOT NULL,
MAT_FMT VARCHAR(8),
MAT_SUB1 VARCHAR(5) NOT NULL,
MAT_SUB2 VARCHAR(5),
MAT_SUB3 VARCHAR(5),
MAT_SUB4 VARCHAR(5),
MAT_NOTE VARCHAR(256)
)



/* Procedure GET_MAT_ID */
CREATE PROCEDURE GET_MAT_ID (
NMAT_SUB1 CHAR(2),
NMAT_SUB2 CHAR(2),
NMAT_SUB3 CHAR(2),
NMAT_SUB4 CHAR(2)
) RETURNS (
NMAT_ID INTEGER,
NMAT_SUB INTEGER
) AS
DECLARE VARIABLE seed integer;
DECLARE VARIABLE lastseed integer;
BEGIN
nmat_id=0;
nmat_sub=0;
lastseed=0;
if (nmat_sub1 is null or nmat_sub1='00')then
begin
nmat_sub=1;
for select cast(mat_sub1 as integer) from material_id
where mat_sub1<>'99' and
mat_sub2 is null and
mat_sub3 is null and
mat_sub4 is null
order by mat_sub1 asc
into :seed
do
begin
if((seed-lastseed)>1)then
begin
nmat_id=lastseed+1;
if(nmat_id>=99 )then exception matclassfull;
exit;
end
lastseed=seed;
end
nmat_id=lastseed+1;
if(nmat_id>99 )then exception matclassfull;
exit;
end
else
if (nmat_sub2 is null or nmat_sub2='00')then
begin
nmat_sub=2;
for
select cast(mat_sub2 as integer) from material_id
where mat_sub1=:nmat_sub1 and
mat_sub2 <>'99' and
mat_sub3 is null and
mat_sub4 is null
order by mat_sub2 asc
into :seed
do
begin
if((seed-lastseed)>1)then
begin
nmat_id=lastseed+1;
if(nmat_id>=99 )then exception matclassfull;
exit;
end
lastseed=seed;
end
nmat_id=lastseed+1;
if(nmat_id>99 )then exception matclassfull;
exit;
end
else
if (nmat_sub3 is null or nmat_sub3='00')then
begin
nmat_sub=3;
for
select cast(mat_sub3 as integer) from material_id
where mat_sub1=:nmat_sub1 and
mat_sub2=:nmat_sub2 and
mat_sub3<>'99' and
mat_sub4 is null
order by mat_sub3 asc
into :seed
do
begin
if((seed-lastseed)>1)then
begin
nmat_id=lastseed+1;
if(nmat_id>=99 )then exception matclassfull;
exit;
end
lastseed=seed;
end
nmat_id=lastseed+1;
if(nmat_id>99 )then exception matclassfull;
exit;
end
else
if (nmat_sub4 is null or nmat_sub4='00')then
begin
nmat_sub=4;
for
select cast(mat_sub4 as integer) from material_id
where mat_sub1=:nmat_sub1 and
mat_sub2=:nmat_sub2 and
mat_sub3=:nmat_sub3 and
mat_sub4<>'999'
order by mat_sub4 asc
into :seed
do
begin
if((seed-lastseed)>1)then
begin
nmat_id=lastseed+1;
if(nmat_id>=999 )then exception matclassfull;
exit;
end
lastseed=seed;
end
nmat_id=lastseed+1;
if(nmat_id>999 )then exception matclassfull;
exit;
end
END



/* Trigger MATERIAL_IDTRGINS */
CREATE TRIGGER MATERIAL_IDTRGINS FOR MATERIAL_ID BEFORE INSERT POSITION 0 AS
DECLARE VARIABLE nmat_id integer;
DECLARE VARIABLE nmat_sub integer;
DECLARE VARIABLE nmatstr varchar(3);
BEGIN
if(new.mat_id='00')then
begin
EXECUTE PROCEDURE get_mat_id
new.mat_sub1,new.mat_sub2,
new.mat_sub3,new.mat_sub4
RETURNING_VALUES :nmat_id,:nmat_sub;
if(nmat_sub=4)then
begin
if(nmat_id<=9)then
nmatstr='00'||cast(nmat_id as char(1));
else if(nmat_id<=99)then
nmatstr='0'||cast(nmat_id as char(2));
else if(nmat_id<=999)then
nmatstr=cast(nmat_id as char(3));
else
exception idtoolarge;
end
else
begin
if(nmat_id<=9)then
nmatstr='0'||cast(nmat_id as char(1));
else if(nmat_id<=99)then
nmatstr=cast(nmat_id as char(2));
else
exception idtoolarge;
end
if(nmat_sub=1)then
begin
new.mat_sub1=nmatstr;
new.mat_id=new.mat_sub1;
end
if(nmat_sub=2)then
begin
new.mat_sub2=nmatstr;
new.mat_id=new.mat_sub1||new.mat_sub2;
end
if(nmat_sub=3)then
begin
new.mat_sub3=nmatstr;
new.mat_id=new.mat_sub1||new.mat_sub2||new.mat_sub3;
end
if(nmat_sub=4)then
begin
new.mat_sub4=nmatstr;
new.mat_id=new.mat_sub1||new.mat_sub2||new.mat_sub3||new.mat_sub4;
end
end
END
 
我现在想用这样的方式处理,不知道可不可行。希望各位大峡指正:
table:
id integer;类别ID
bh:varchar(10);编号
parentid int; 父类别
grade int 类别的级数;
这样设计,对我以前的程序有影响吗(以前我只是用ID,和BH)这个回答完
就可以收关了
 
大类id、大类名称、小类id、小类名称

大类时、小类为空

树型结构
 
对多层树的查询比单表复杂,且慢的多,在设计时应考虑!
 

Similar threads

后退
顶部