类别和子类别的数据库结构

时间:2012-04-25 06:12:13

标签: php sql-server recursion

我有点困惑什么可以是类别数据库结构的最佳解决方案。在这里,我有以下的cateogry列表。

  1. 新闻

    1.1一般新闻

    1.2娱乐新闻

    1.3体育新闻

  2. 2.1每日星座运势

      2.1.1 Aries
    
      2.1.2 Taurus
    
      2.1.3 Gemini
    
       .....
    
      2.1.12 Pisces
    

    2.2每周星座运势

      2.2.1 Aries
    
      2.2.2 Taurus
    
      2.2.3 Gemini
    
       .....
    
      2.2.12 Pisces
    
  3. 笑话

  4. 这是我目前的类别列表。在这里,我必须构建管理面板,其中可以添加类别和子类别。目前,我有2个星座类星座。在未来,可以添加更多子类别,例如月度和年度星座运势。另一个困惑是每日和每周占星具有相同的子类别,这意味着单个子类别具有多个父类别。在这里,我如何消除数据库表中的重复。我需要使用递归函数在树结构中显示类别。    我谷歌的解决方案,我找不到合适的答案。你能不能给我答案或者与之相关的链接。我在php和MS-server数据库中编码。

5 个答案:

答案 0 :(得分:1)

如何尝试这样的东西,有一个类别表,其中包含以下字段,id,parent_id和title, 然后,每个类别都有一个parent_id或0表示顶级类别。

如果您愿意,您可以将标题设为包含ID和标题的不同表格,然后您可以在类别表格中引用标题表格上的相应标题。

想一想,它将遵循这个规则集,这正是您正在寻找的:

  • 每个类别与零个或多个类别相关联。
  • 每个类别都与一个标题相关联。
  • 每个标题都与一个或多个类别相关联。

至于递归表示它,这种方式相当容易。 希望能为你做到这一点。

答案 1 :(得分:1)

这是一篇关于使用公用表表达式在sql 2005中进行递归查询的文章。

http://www.sqlservercentral.com/articles/T-SQL/recursivequeriesinsql1999andsqlserver2005/1846/

我建议你注册他们的时事通讯,几乎每天都有新的东西可以派上用场。

答案 2 :(得分:1)

这里是我几年前写的一些丑陋的代码......但它可以帮助你作为操作方法

数据库表“table_name”结构

ID  PARENT  NAME
1     0      1
2     0      2
3     1      1.1
4     1      1.2
5     4      1.2.1
6     4      1.2.2
7     2      2.1

获取和准备数据

$Select = mysql_query("SELECT * FROM table_name");
while($Row = mysql_fetch_assoc($Select)){
  if($Row['parent'] == 0){
    $Arr[$Row['id']] = $Row['name'];
  }else{
    $Childs[$Row['parent']][$Row['id']] = $Row['name'];
  }
}

一些愚蠢但充足的功能

function gettree($Array){
  global $Childs;
  foreach($Array as $key => $value){
    echo '<li>'.$value.'</li>';
    if(isset($Childs[$key])){
      echo '<li><ul>';
      gettree($Childs[$key]);
      echo '</ul></li>';
    }
  }
}

并将树建成

echo '<ul>';
gettree($Arr);
echo '</ul>';

结果应该像这样

1
 1.1
 1.2
  1.2.1
  1.2.2
2
 2.1

我建议您将其重写为对象以便更好地使用

  

抱歉我的英文

答案 3 :(得分:0)

您的数据库结构应包含其父相关ID,并在管理面板中获取selectbox中的父类别和子父类别

USE `database`;


CREATE TABLE `category` (
`c_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `category_name` varchar(255) DEFAULT NULL,
 `status` enum('active','inactive') DEFAULT 'active',
 PRIMARY KEY (`c_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

/*Data for the table `category` */

insert  into `category`(`c_id`,`category_name`,`status`) values (1,'For Sale','active'),(2,'Community','active'),(3,'Classes','active'),(4,'Vehicles','active'),(5,'Real Estate','active'),(6,'Services','active'),(7,'Matrimonial','active'),(8,'Jobs','active');
CREATE TABLE `sub_category` (
`sub_cat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
`sub_category_name` varchar(255) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`sub_cat_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

/*Data for the table `sub_category` */

insert  into `sub_category`(`sub_cat_id`,`c_id`,`sub_category_name`,`status`) values (1,1,'Animals','active'),(2,1,'Art - Collectibles','active'),(3,1,'Books - Magazines','active'),(4,1,'Business - Industrial','active'),(5,4,'Cars','active'),(6,4,'Truck','active');
/*Table structure for table `sub_category_child` */
CREATE TABLE `sub_category_child` (
`sub_category_child_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
 `sub_cat_id` int(11) DEFAULT NULL,
`sub_category_child_label` varchar(255) DEFAULT NULL,
`nature` varchar(20) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
 PRIMARY KEY (`type_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

insert  into `sub_category_child`(`sub_category_child_id`,`c_id`,`sub_cat_id`,`sub_category_child_label`,`nature`,`status`) values (1,4,5,'Make','parent','active'),(2,4,5,'Model','child','active'),(3,4,5,'doors','independent','active'),(4,4,5,'accessories','independent','active'),(5,1,1,'abc','parent','active'),(6,4,6,'No of Tyre','parent','active'),(8,4,6,'loader','independent','active');

答案 4 :(得分:0)

这对我有用:

CREATE TABLE [dbo].[Category](
[id] [int] IDENTITY(1,1) NOT NULL,
[Cat_Id] [int] NOT NULL,
[Cat_Nm] [varchar](50) NOT NULL,
[Parent_Id] [int] NULL,
 CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

/****** Object:  Index [IX_Category]    Script Date: 04/25/2012 07:30:14 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Category] ON [dbo].[Category] 
(
[Cat_Id] ASC,
[Cat_Nm] ASC,
[Parent_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Category]  WITH CHECK ADD  CONSTRAINT [FK_Category_Category] FOREIGN KEY([Parent_Id])
REFERENCES [dbo].[Category] ([id])
GO
ALTER TABLE [dbo].[Category] CHECK CONSTRAINT [FK_Category_Category]

GO

SET IDENTITY_INSERT [dbo].[Category] ON;
INSERT INTO [dbo].[Category]([id], [Cat_Id], [Cat_Nm], [Parent_Id])
SELECT 9, 1, N'Aries', 7 UNION ALL
SELECT 12, 1, N'Aries', 8 UNION ALL
SELECT 7, 1, N'Daily', 2 UNION ALL
SELECT 4, 1, N'General News', 1 UNION ALL
SELECT 1, 1, N'News', NULL UNION ALL
SELECT 5, 2, N'Enterntainment News', 1 UNION ALL
SELECT 2, 2, N'Horoscope', NULL UNION ALL
SELECT 10, 2, N'Taurus', 7 UNION ALL
SELECT 13, 2, N'Taurus', 8 UNION ALL
SELECT 8, 2, N'Weekly', 2 UNION ALL
SELECT 11, 3, N'Gemini', 7 UNION ALL
SELECT 14, 3, N'Gemini', 8 UNION ALL
SELECT 3, 3, N'Jokes', NULL UNION ALL
SELECT 6, 3, N'Sports News', 1
SET IDENTITY_INSERT [dbo].[Category] OFF;

GO

CREATE VIEW Categories
AS
    WITH    cte ( id, Cat_Id, [Name], [Level] )
              AS ( SELECT   id ,
                        Cat_Id ,
                        Cat_Nm ,
                        CAST(Cat_Id AS VARCHAR(5))
               FROM     dbo.Category c
               WHERE    Parent_Id IS NULL
               UNION ALL
               SELECT   c.id ,
                        c.Cat_Id ,
                        c.Cat_Nm ,
                        CAST(ct.[Level] + '.'
                        + CAST(c.Cat_Id AS VARCHAR(5)) AS VARCHAR(5))
               FROM     dbo.Category c
                        JOIN cte ct ON c.Parent_Id = ct.id
               WHERE    c.Parent_Id IS NOT NULL
             )
SELECT  Level ,
        Name
FROM    cte