你这样设计是我能接受的,因为以值得冗余换取速度的最大化
除非你愿意让father成为以符号间隔的类型

解决方案 »

  1.   

    你是意思是不是吧:
    3    JBuilder    1
    4    JBuilder    2换成:
    3    JBuilder    1,2这样的形式?
      

  2.   

    -----如果设置这样一个结构,一个父类有多个子类,一个子类有多个父类的情况。我不知道你什么意思,但我告诉你上面这句话没有可能实现的。java是单继承语言,一个子类只能有一个父类。
      

  3.   

    alienbat(死灵巫师) :
      这定义数据库结构更Java有关系吗?
      

  4.   

    拆成两个表就解决了,如果
    是Java的问题,用Interface
      

  5.   

    wuyg(wuyuguang) : 拆成两个表?怎么拆呢?能做些说明吗?谢谢!
      

  6.   

    这中情况,直接用数据库读取操作处理,要是设计成java结构,
    或者可以这样一个结构:
    public class jiegou{
     private int id;
     private String name;
     private int[] fatheid;//存放斧节点的点
    .....
     get()
    ..
    set()
    ......
      }
      

  7.   

    这种结构从父类继承是不行的,
    建议用interface
      

  8.   

    使用interface 可以继承"父类"的性状!!  (注意,这里没有设置父子的关联关系!!)使用shaokun305(混口饭吃!) 的private int[] fatheid;//存放斧节点的点可以设置父子的关联关系!!!请大家搞清楚情况!!!  感觉说得糊里糊涂的????  我倒!!!
      

  9.   

    加入一个表使得多对多的关系转化为一对多的关系BaseTable:
    ID name
    1 java
    2 Borland
    3 JBuilder RelationTable
    ChildID ParentID
    3        1
    3        2
      

  10.   

    To uiiu:just as you know!
    To carolbaby:I think the redundant is not better than uiiu's!
    To all:this is a database structure problem,not java!
      

  11.   

    基本同意uiiu(刚学)的意见。总的来说搂主是不是要这样的东西:表的结构: ID name father
    表中数据: 1 java 0
     2 Borland 0
     3 JBuilder          1
     4 JBuilder          1/2小人的愚见!!  刚刚看数据结构   !!!望楼主见谅!!!
      

  12.   

    首先谢谢各位!我原来想要的是(father改为字符串格式保存该记录的所有父类ID,用特定符号分割,只是这样查询的时候用到like语句,我想like语句效率不高。所以我想吧father换成int格式):表的结构: ID   name     father
    表中数据: 1    java     0
         2    Borland   0
         3    JBuilder   1,2
    to:carolbaby(猫儿) 不知道分成两个表是否在效率上比我那上面的设置更好?
      

  13.   

    一个表可以实现多几继承,可以实现多彩旦,但是数据库的效率比较低
    id fatherid
    不过可以通过一次性把数据库中所有的记录全部读出来,在内存实现递归生成数。
    // $Id: MenuTree.java,v 1.10 2000/02/02 15:18:35 gongke Exp $
    package peiyang.priv;public class MenuTree {
      public ArrayList cach = new ArrayList();
      private DB mydb = new DB();
      /**
       * 取得子菜单数据集(递归调用)
       */
      public void getChildMenu(int fatherId) throws java.sql.
          SQLException {
        CachedRowSet rs = new CachedRowSet();
          for (int i=0;i<cach.size();i++){
            Menu menuItems=(Menu)cach.get(i);
            if (menuItems.getFatherId()==fatherId){
              Menu menuItem = new Menu();
              menuItem.setMenuId(menuItems.getMenuId());
              menuItem.setMenuName(menuItems.getMenuName());
              menuItem.setMenuLevel(menuItems.getMenuLevel());
              menuItem.setMenuUrl(menuItems.getMenuUrl());
              menuItem.setFatherId(menuItems.getFatherId());
              tree.add(menuItem);
              getChildMenu(menuItem.getMenuId());
            }
          }  }
      public void initial() {
         CachedRowSet rs = null;
         try {
           String sql = "select * from Menu order by menuOrder";
           //System.out.println(sql);
           rs = mydb.executeQuery(sql);
           while (rs.next()) {
             Menu menuItem = new Menu();
             menuItem.setMenuId(rs.getInt("menuId"));
             menuItem.setMenuName(rs.getString("menuName"));
             menuItem.setMenuLevel(rs.getInt("menuLevel"));
             menuItem.setFatherId(rs.getInt("fatherId"));
             menuItem.setMenuUrl(rs.getString("menuUrl"));
             cach.add(menuItem);
           }
         }
         catch (Exception e) {
           System.out.println("initial:"+e.getMessage());
         }
       }  public void destroy() {
        cach.clear();
      }  public static void main(String args[]) {//测试用利
        MenuTree mytree = new MenuTree();
        mytree.initial("1");
        try {
          mytree.getUserMenu(0, "1");
        }
        catch (Exception e) {
          System.out.println(e.getMessage());
        }
        for (int i = 0; i < mytree.tree.size(); i++) {
          Menu myMenu = (Menu) mytree.tree.get(i);
          System.out.println(myMenu.getMenuName());
        }
      }
    }
    这样对于数据库中角色和彩旦不多的情况下,数据库访问速度可以不计,而在内存中实现递归也很快。
      

  14.   

    我不太清楚效率问题,我倾向于做两张表是因为,如果把多个ParentID的值用分割符隔开放在字段里面,相当于每一条记录中有了多个ParentID项,这样就违背了数据库设计的准则,也使得用主外键控制数据合法性变得不可能。
      

  15.   


    同意  carolbaby(猫儿) 的看法。To longrenrex(菜菜龙) 从楼主的例子不是可以看出“一个子类可以有多个父类”吗?
      

  16.   

    你为什么不用id作为pk, 就可以得到ID   name     father
    表中数据: 1    java     0
         2    Borland   0
         3    JBuilder   1
             4       JBuilder    2
      

  17.   

    关于数据库存储结构的问题不应该在java论坛上问。
      

  18.   

    慢慢想觉得 carolbaby(猫儿) 的哪两个表设计得还是有道理的. 请问:sadenxu(天蝎座的蛇不一定是天下最毒的毒蛇) 您为什么会说“I think the redundant is not better than uiiu's!”能说说你的看法吗?