怎样用一个表来存储一个产品的多个类别资料,比如:产品抛光砖的类别为:大堂类、地面类、磁砖类,就是说,产品抛光砖是属于大堂类的地面类的磁砖类。基中,大堂类、地面类、磁砖类都是三个并列的类别,我现在想得到这样的效果,怎样把这三个类别放到一个表里,让它来表示一个产品的类别。如果给产品表再加n个字段来表示类别的话,那样很麻烦,而且还不知道这个产品到底会有几级类别。请大哥们帮忙想想办法,应该怎么设计数据库来实现!(在线等)

解决方案 »

  1.   

    用树来表示ID   当前类
    PID  父类标记
    Name....
    ID  PIA   Name
    0   -1    抛光砖
    1    0    大堂类
    2    0    地面类
      

  2.   

    根据数据库原理的范式规则设计,应该是把这个表设置成(类别,产品名)操作的时候
      with adoquery do
      begin
       close;sql.clear;
       sql.add('select 类别,产品名 from 表 where  产品名='+quotedstr(产品名));
       open;
       end;
    这样不就OK了
      

  3.   

    //参考如下代码~~
    object Form1: TForm1
      Left = 192
      Top = 107
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object TreeView1: TTreeView
        Left = 24
        Top = 16
        Width = 121
        Height = 97
        Indent = 19
        TabOrder = 0
      end
      object BitBtnItemEdit: TBitBtn
        Left = 3
        Top = 137
        Width = 75
        Height = 25
        Caption = '修改类别'
        TabOrder = 1
        OnClick = BitBtnItemEditClick
      end
      object BitBtnItemDelete: TBitBtn
        Left = 75
        Top = 137
        Width = 75
        Height = 25
        Caption = '删除类别'
        TabOrder = 2
        OnClick = BitBtnItemDeleteClick
      end
      object BitBtnItemPlue: TBitBtn
        Left = 147
        Top = 137
        Width = 75
        Height = 25
        Caption = '添加类别'
        TabOrder = 3
        OnClick = BitBtnItemPlueClick
      end
      object BitBtnItemAppend: TBitBtn
        Left = 219
        Top = 137
        Width = 75
        Height = 25
        Caption = '加子类别'
        TabOrder = 4
        OnClick = BitBtnItemAppendClick
      end
      object BitBtnSave: TBitBtn
        Left = 288
        Top = 137
        Width = 75
        Height = 25
        Caption = '保存(&S)'
        TabOrder = 5
        OnClick = BitBtnSaveClick
      end
      object ADOQuery1: TADOQuery
        AfterOpen = ADOQuery1AfterOpen
        Parameters = <>
        Left = 184
        Top = 24
      end
    endunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        ADOQuery1: TADOQuery;
        TreeView1: TTreeView;
        BitBtnItemEdit: TBitBtn;
        BitBtnItemDelete: TBitBtn;
        BitBtnItemPlue: TBitBtn;
        BitBtnItemAppend: TBitBtn;
        BitBtnSave: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure ADOQuery1AfterOpen(DataSet: TDataSet);
        procedure BitBtnItemEditClick(Sender: TObject);
        procedure BitBtnItemDeleteClick(Sender: TObject);
        procedure BitBtnItemPlueClick(Sender: TObject);
        procedure BitBtnItemAppendClick(Sender: TObject);
        procedure BitBtnSaveClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}uses ComObj;function CreateDatabase(mDatabaseName: string): Boolean;
    var
      CreateAccess: OLEVariant;
    begin
      Result := False;
      try
        CreateAccess := CreateOleObject('ADOX.Catalog');
        try
          CreateAccess.Create(Format(
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s',
          [mDatabaseName]));
        finally
          CreateAccess := Unassigned;
        end;
      except
        Exit;
      end;
      Result := True;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      vDatabaseName: string;
    begin  vDatabaseName := ExtractFilePath(Application.ExeName) + 'test.mdb';
      ADOQuery1.ConnectionString := Format(
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s"', [vDatabaseName]);
      ///////Begin 创建模拟数据
      if not FileExists(vDatabaseName) then
      begin
        if not CreateDatabase(vDatabaseName) then Application.Terminate;
        try
          ADOQuery1.Close;
          ADOQuery1.SQL.Text := 'CREATE TABLE TableTree (id int, TreeText text)';
          ADOQuery1.ExecSQL;
          ADOQuery1.SQL.Text := Format('insert into TableTree (id, TreeText) values (0, %s)',
            [QuotedStr(
    '1'#13#10 +
    #9'1a'#13#10 +
    #9'1b'#13#10 +
    '2'#13#10 +
    #9'2a'#13#10 +
    #9'2b'#13#10 +
    #9#9'2b-A'#13#10)]);
          ADOQuery1.ExecSQL;
        except
          Exit;
        end;
      end;
      ///////End 创建模拟数据
      ADOQuery1.SQL.Text := 'select * from TableTree';
      ADOQuery1.Open;
    end;procedure TreeViewLoadFromString(mTreeView: TTreeView; mString: string);
    var
      vStringStream: TStringStream;
    begin
      vStringStream := TStringStream.Create(mString);
      try
        vStringStream.Position := 0;
        mTreeView.LoadFromStream(vStringStream);
      finally
        vStringStream.Free;
      end;
    end; { TreeViewLoadFromString }function TreeViewSaveToString(mTreeView: TTreeView): string;
    var
      vStringStream: TStringStream;
    begin
      vStringStream := TStringStream.Create('');
      try
        mTreeView.SaveToStream(vStringStream);
        Result := vStringStream.DataString;
      finally
        vStringStream.Free;
      end;
    end; { TreeViewSaveToString }procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
    begin
      TreeViewLoadFromString(TreeView1,
        DataSet.FieldByName('TreeText').AsString);
    end;procedure TForm1.BitBtnItemEditClick(Sender: TObject);
    var
      S: string;
    begin
      if not Assigned(TreeView1.Selected) then Exit;
      S := TreeView1.Selected.Text;
      if not InputQuery('修改类别', '', S) then Exit;
      TreeView1.Selected.Text := S;
      if TreeView1.CanFocus then TreeView1.SetFocus;
    end;procedure TForm1.BitBtnItemDeleteClick(Sender: TObject);
    begin
      if MessageDlg('确定删除?', mtWarning, [mbYes, mbNo], 0) = mrYes then
        TreeView1.Selected.Delete;
      if TreeView1.CanFocus then TreeView1.SetFocus;
    end;procedure TForm1.BitBtnItemPlueClick(Sender: TObject);
    var
      S: string;
    begin
      if not Assigned(TreeView1.Selected) then Exit;
      S := '新类别';
      if not InputQuery('添加类别', '', S) then Exit;
      TreeView1.Selected := TreeView1.Items.Add(TreeView1.Selected, S);
      if TreeView1.CanFocus then TreeView1.SetFocus;
    end;procedure TForm1.BitBtnItemAppendClick(Sender: TObject);
    var
      S: string;
    begin
      if not Assigned(TreeView1.Selected) then Exit;
      S := '新子类别';
      if not InputQuery('添加子类别', '', S) then Exit;
      TreeView1.Selected := TreeView1.Items.AddChild(TreeView1.Selected, S);
      if TreeView1.CanFocus then TreeView1.SetFocus;
    end;procedure TForm1.BitBtnSaveClick(Sender: TObject);
    begin
      ADOQuery1.First;
      if ADOQuery1.RecordCount <= 0 then
        ADOQuery1.Append
      else ADOQuery1.Edit;
      ADOQuery1.FieldByName('TreeText').AsString := TreeViewSaveToString(TreeView1);
      ADOQuery1.Post;
    end;end.