繁体   English   中英

具有第一层子类别和第二层子类别的类别的MySQL规范化

[英]MySQL Normalization with Category with 1st Tier Sub-Category and 2nd Tier Sub-Category

我正在学习网页设计数据库的规范化,我找不到我需要的答案。 我能够从我在网上找到的一些教程开始,但找不到我能理解的答案。

我有几个产品类别,如:电子产品,电器。 (我们称之为“类别”)。

电子产品本身有子类别:手机,电脑,平板电脑。 (“第一级”)

然后手机有自己的类别:智能手机,平板电脑等(“第二层类别”)

所以目前我有这样的表:

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     |
------------------------------------------

这是我被困的地方。 如何创建第二层类别表以及如何创建在这种情况下有效的链接表? 谢谢你们的时间。

使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM