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

when should i create a separate table for fields?

假设我有这个 SQL table :

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

我是否应该创建另一个包含 familysub_family 所有可能组合的 table 并使用 foreing key 引用它?


数据示例:

我也看了你的问题和评论。我认为您可以创建两个不同的 tables,这肯定会减少数据冗余和复杂性。

您可以创建家庭作为家长table: 在 Family table 中,您可以为每个 Family 和 sub-Family 对声明一个唯一键(您可以进一步将其用于外键引用),例如:

家庭:

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

并且您可以为文章创建另一个 table,它将通过外键引用 ID 与父级关联。

文章:

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

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

如果您想完全修复冗余,请尝试以下方法table:

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 table 中的数据可能如下所示:

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)

在我看来,这个table是用来保存食物菜单数据的,应该很小。我认为创建一个专门的 table 来拯救家人和 sub_family.

是可以的