2012-04-25 52 views
1

我有點困惑什麼是類別數據庫結構的最佳解決方案。在這裏,我有以下cateogry列表。類別和子類別的數據庫結構

  1. 新聞

    1.1一般新聞

    1.2 Entertaintment新聞

    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數據庫編碼。

+2

我心目中最好的解決辦法是有一個字段'parent_id'其引用到同一個表 – k102 2012-04-25 06:16:44

+0

什麼SQL你使用的服務器版本是? – Arion 2012-04-25 06:25:42

+0

可能的重複http://stackoverflow.com/questions/5132875/categories-and-subcategories(在我的答案中有一般的解決方案) – SergeS 2012-04-25 06:26:37

回答

1

如何嘗試這樣的事情,有一個類別表具有以下字段,id,parent_id和標題, 每個類別都有一個parent_id或0爲頂級類別。

如果您希望可以將標題設置爲擁有ID和標題的不同表格,然後您可以在類別表格上引用titles表格上適當的標題。

它想,它會遵循這個規則集這是你在尋找什麼:

  • 每個類別與零個或多個類別相關聯。
  • 每個類別都與一個標題相關聯。
  • 每個標題都與一個或多個類別相關聯。

至於遞歸表示它,這是相當容易的這種方式。希望能爲你解決問題。

+0

您能否提供循環遍歷所有類別和子類別的遞歸函數示例列表.. – 2012-04-25 07:43:53

0

你的數據庫結構應該B本包含其父相關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'); 
1

這裏父類別和子類別的母公司是一些醜陋的代碼,我幾年前寫的......但它可以幫助你如何對

DB表「表格名」結構

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

和BULDING樹爲HTML

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

和結果應該是這樣

1 
1.1 
1.2 
    1.2.1 
    1.2.2 
2 
2.1 

我建議你把它改寫爲你對象爲更好的使用

對不起,我的英語

+0

我認爲可以有多個具有相同索引的數組。在這裏,數組可以有多個相同的索引,因爲父列不具有唯一值,例如在while循環中,可能有$ childs [1] [1]兩次替代以前的值。 – 2012-04-25 08:21:29

+0

但ID列是唯一的,所以它不會取代以前的值,只需向數組中添加另一個值即可。此解決方案使用多維數組。 – miro 2012-04-25 08:24:29

+0

哦..我的錯,我顯然沒有得到你的答案。對不起 – miro 2012-04-25 08:28:26

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