1

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

  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. 笑话

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

4

5 回答 5

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>';
    }
  }
}

并将树构建为 html

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

结果应该是这样的

1
 1.1
 1.2
  1.2.1
  1.2.2
2
 2.1

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

对不起我的英语不好

于 2012-04-25T07:47:17.440 回答
1

尝试这样的事情怎么样,有一个类别表,其中包含以下字段,id,parent_id 和 title,然后每个类别都有一个 parent_id 或 0 用于顶级类别。

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

想想看,它会遵循这个规则集,这正是你正在寻找的:

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

至于递归表示它,这种方式相当容易。希望这对你有用。

于 2012-04-25T06:40:34.003 回答
1

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

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

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

于 2012-04-25T06:52:02.180 回答
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
于 2012-04-25T14:38:04.857 回答
0

您的数据库结构应该包含它们的父相关 ID,并在管理面板中获取父类别和选择框中的子父类别

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');
于 2012-04-25T07:09:19.067 回答