求高手指导,网站栏目无限分层,应当怎样设计数据库?
怎样实现?有没有例子可以参考一下。

解决方案 »

  1.   

    id parentid name
    ----------------
    1  null     根目录
    2  1        一级a
    3  2        二级a-1
    4  2        二级a-2
    5  1        一级b
    6  5        二级b-1
    7  6        三级b-1-1
    8  5        二级b-2
    ...
      

  2.   

    像1L那样。  有个id,parentid足以
      

  3.   

    两个字段。ID,上级ID。层次1--层次2---层次3--……数据库就是这样的
    层次1,ID=1980,上级ID=0  说明是顶层
    层次2,ID=2542,上级ID=1980 说明他是 层次1的下层
    层次3, ID=10045,上级ID=2542 说明他是 层次2的下层
     
      

  4.   

    这个方案把相对路径法和绝对路径法相结合,强烈推荐,我再补充一下:
    1.可以用表达式字段存储绝对路径,系统会在insert,update时自行维护绝对路径;
    2.绝对路径改成(或者在增加一个字段)ParentPath更好
      

  5.   

    两个字段就够了,所谓的字典表。id,上级id
      

  6.   

    预览效果图:
     详见:http://www.soaspx.com/dotnet/csharp/csharp_20101109_6358.html
     
     
    数据库结构:
     
    id(int)    classname(string)   parentid(int) sort(int用于显示与排序)
     
    1  家居  0  1
     
    2  家电  0  2
     
    3  沙发  1  1
     
    4  某...   3      1
     
    ...
     
    10   ...红色   4      1
     
     
     
     注:
     
    parentid  父节点ID
     
    sort 用于隐藏或显示 兼排序功能
     
     
     
    前台:
     
     
     <asp:Repeater ID="rep" runat="server" onitemdatabound="rep_ItemDataBound">
     <HeaderTemplate></HeaderTemplate>
     <ItemTemplate></ItemTemplate>
     <FooterTemplate></FooterTemplate>
     </asp:Repeater>
     
     
     
     
     
    后台:
     
     
     
    代码 public partial class 递归2 : System.Web.UI.Page
     {
         public List<cmodel> list;
         protected void Page_Load(object sender, EventArgs e)
         {
             if (!IsPostBack)
             {
                 rules r = new rules();
                 list = r.getlist();//读取数据库
                 this.rep.DataSource = list.Where(x => x.parentid == 0).ToList();//LINQ2OBJECT
                 this.rep.DataBind();
             }
         }
     
        protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
         {
             if (e.Item.ItemType == ListItemType.Header)
             {
                 Literal l = new Literal();
                 l.ID = "ul";
                 l.Text="<ul>";
                 e.Item.Controls.Add(l);
             }
             else if (e.Item.ItemType == ListItemType.Footer)
             {
                 Literal l = new Literal();
                 l.ID = "ul2";
                 l.Text = "</ul>";
                 e.Item.Controls.Add(l);
             }
             else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
             {
                 int id = (int)DataBinder.Eval(e.Item.DataItem, "id");
                 Literal li1 = new Literal();
                 li1.ID = "li1";
                 li1.Text = "<li>";
                 e.Item.Controls.Add(li1);
     
                Literal name = new Literal();
                 name.ID = "n";
                 name.Text = DataBinder.Eval(e.Item.DataItem, "classname").ToString();
                 e.Item.Controls.Add(name);
                 List<cmodel> temp = list.Where(x => x.parentid == id).ToList();//LINQ2OBJECT
                 if (temp.Count > 0)
                 {
                     Repeater r = new Repeater();
                     TemplateBuilder tb = new TemplateBuilder();
                     tb.AppendLiteralString("");
                     r.HeaderTemplate = tb;
                     r.FooterTemplate = tb;
                     r.ItemTemplate = tb;
                     r.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound); //递归核心
                     r.DataSource = temp;
                     r.DataBind();
                     e.Item.Controls.Add(r);
                 }
                 Literal li2 = new Literal();
                 li2.ID = "li2";
                 li2.Text = "</li>";
                 e.Item.Controls.Add(li2);
             }
         }
     
    }
      
     
     
     
    使用到的类:
     
    代码 public class rules
     {
         DataClasses1DataContext dc = new DataClasses1DataContext();
     
        public List<cmodel> getlist()
         {
             var q = from x in dc.ClassFJ
                     where x.sort > 0  //用于控制显示隐藏
                     orderby x.sort    //兼职排序功能
                     select new cmodel
                     (
                         x.id,
                         x.className,
                         x.parentid
                     );
             return q.ToList<cmodel>();
         }
     }
     
    public class cmodel
     {
         public cmodel(int i,string n,int p)
         {
             id = i;
             classname = n;
             parentid = p;
         }
         public int id { get; set; }
         public string classname { get; set; }
         public int parentid { get; set; }
     }
     
    抛砖引玉,话不多讲。
      

  7.   

    id,parentid 这类方法是可以解决。
    但是考虑到效率问题,一旦数据量一多 以后递归量增多,会严重影响效率。
    可以添加适当辅助字段,优化递归方式。