2014-01-22 51 views
3

我正在學習數據庫中的網頁設計規範化,找不到我需要的答案。我能夠從網上找到的一些教程開始,但找不到我能理解的答案。帶有第一級子類別和第二級子類別的MySQL規範化

我有幾個產品類別,例如:電子產品,電器。 (我們稱他們爲「類別」)。

電子產品本身有子類別:手機,電腦,平板電腦。 (「第一層類別」)

然後手機都有自己的分類:智能手機,平板電腦電話等(「二線類」)

所以目前我有表這樣:

Categories table 
------------------------------------------ 
| category_id  | category_name | 
------------------------------------------ 
|   1   |  Electronics | 
|   2   |  Appliances | 
------------------------------------------ 

1st tier categories table 
------------------------------------------ 
| category_id  | 1st_tier_name | 
------------------------------------------ 
|   1   |  Cell phones | 
|   1   |  Computers | 
|   1   |  Tablets  | 
------------------------------------------ 

這裏是我卡住的地方。如何創建第二層分類表,以及如何創建適用於此情況的鏈接表?謝謝你們的時間。

+0

這似乎是關於分層數據的問題 – Strawberry

+0

對樹結構使用單獨的表一般來說,這不是一個好主意。所有這些都是類別,因此它們應該存儲在一個表中,具有唯一的主鍵(如category_id)和parent_id(可以爲null或其他類別ID)。這樣,您可以通過選擇parent_id爲空的所有類別以及parent_id爲父級的category_id的子類別來獲得主要類別。 – Eternal1

回答

4

使用PARENT_ID指定的記錄所屬類別:

+--------+---------------+-----------+ 
| cat_id | name   | parent_id | 
+--------+---------------+-----------+ 
|  1 | Electronics |   0 | 
|  2 | Appliances |   0 | 
|  3 | Cell phones |   1 | 
|  4 | Computers  |   1 | 
|  5 | Tablets  |   1 | 
|  6 | Smartphones |   3 | 
|  7 | Tablet Phones |   3 | 
+--------+---------------+-----------+ 

要選擇所需要的數據,你可以提高像查詢:

mysql> SELECT 
    -> a.name AS main_category, 
    -> b.name AS second_level_category, 
    -> c.name AS thrid_level_category 
    -> FROM categories AS a 
    -> LEFT JOIN categories AS b ON (a.cat_id=b.parent_id) 
    -> LEFT JOIN categories AS c ON (b.cat_id=c.parent_id) 
    -> WHERE a.parent_id=0; 
+---------------+-----------------------+----------------------+ 
| main_category | second_level_category | thrid_level_category | 
+---------------+-----------------------+----------------------+ 
| Electronics | Cell phones   | Smartphones   | 
| Electronics | Cell phones   | Tablet Phones  | 
| Electronics | Computers    | NULL     | 
| Electronics | Tablets    | NULL     | 
| Appliances | NULL     | NULL     | 
+---------------+-----------------------+----------------------+ 

@Last評論:

mysql> desc categories; 
+-----------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+-------------+------+-----+---------+----------------+ 
| cat_id | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(50) | YES |  | NULL |    | 
| parent_id | varchar(50) | YES |  | NULL |    | 
+-----------+-------------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

mysql> show create table categories\G 
*************************** 1. row *************************** 
     Table: categories 
Create Table: CREATE TABLE `categories` (
    `cat_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) DEFAULT NULL, 
    `parent_id` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`cat_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 
+0

這允許重用您的類別代碼(而不是爲每個層次編寫兩組模型或處理程序)。 –

+0

謝謝。你能否向我解釋一下b和c應該如何組織? 「分類」是您提供的第一張桌子? – user3117155

+0

@ user3117155有一個單獨的表格,這些表格與其自身連接。 a,b,c是別名。 – aconrad