我什么时候应该为字段创建一个单独的 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
我是否应该创建另一个包含 family
和 sub_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.
是可以的
假设我有这个 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
我是否应该创建另一个包含 family
和 sub_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.
是可以的