我应该在什么时候为字段创建一个单独的表?

4c8rllxm  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(460)

假设我有一个sql表:

CREATE TABLE `article` (
 `article_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `family` varchar(255) NOT NULL,
 `sub_family` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `price` float NOT NULL,
 PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

这里每 family 的文章有一个或多个 sub_family 我应该创建另一个包含所有可能的 family 以及 sub_family 并使用 foreing key ?
数据示例:

wpx232ag

wpx232ag1#

如果要完全修复冗余,请尝试下表:

create table `family` (
 `family_id` int(11) NOT NULL AUTO_INCREMENT,
 `family` varchar(255) NOT NULL,
 `parent_id` int(11) NOT NULL,
 PRIMARY KEY (`family_id`),
 index idx_family_sub (`family`, `parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `article` (
 `article_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `family_id` int(11) not null,
 `price` float NOT NULL,
 PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表2中的数据可能如下所示:

mysql> select * from family order by family_id;
+-----------+-------------+-----------+
| family_id | family      | parent_id |
+-----------+-------------+-----------+
|         1 | Main Course |         0 |
|         2 | Beverage    |         0 |
|         3 | Pasta       |         1 |
|         4 | Hot Drinks  |         2 |
|         5 | Cold Drinks |         2 |
+-----------+-------------+-----------+
5 rows in set (0.00 sec)

mysql> select * from article;
+------------+-----------+-----------+-------+
| article_id | name      | family_id | price |
+------------+-----------+-----------+-------+
|          1 | Spaghetti |         3 |   600 |
|          2 | Penne     |         3 |   500 |
|          3 | Coffee    |         4 |   100 |
|          4 | Penne     |         5 |   150 |
+------------+-----------+-----------+-------+
4 rows in set (0.00 sec)

获取所有数据(如数据)的查询示例如下:

mysql> select
    ->        a.article_id, a.name, f2.family as family, f.family as sub_family, a.price
    -> from `article2` a
    ->     join family2 f on a.family_id = f.family_id
    ->     join family2 as f2 on f.parent_id = f2.family_id;
+------------+-----------+-------------+-------------+-------+
| article_id | name      | family      | sub_family  | price |
+------------+-----------+-------------+-------------+-------+
|          1 | Spaghetti | Main Course | Pasta       |   600 |
|          2 | Penne     | Main Course | Pasta       |   500 |
|          3 | Coffee    | Beverage    | Hot Drinks  |   100 |
|          4 | Penne     | Beverage    | Cold Drinks |   150 |
+------------+-----------+-------------+-------------+-------+
4 rows in set (0.00 sec)

从我的Angular 来看,这个表是用来保存食物菜单数据的,它应该非常小。我认为可以创建一个专用表来保存family和sub-u family。

zazmityj

zazmityj2#

我也读了你的问题和评论。我认为您可以创建两个不同的表,这肯定会减少数据冗余和复杂性。
可以将族创建为父表:在族表中,可以为每个族和子族对声明一个唯一键(可以进一步用于外键引用),例如:
家庭:

ID   | Family_name | Subfamily
1       Beverage     Hot Drinks
2       Beverage     cold Drinks
3       main course  Pasta

您还可以为项目创建另一个表,这些项目将通过外键引用id与父级连接。
文章:

ID  |  Family | Name       | Price
  1       2      Milk Shake    100.00
  2       1      Coffee        200.00

你可以试试这样的。我希望你觉得这很容易理解。

相关问题