gpt4 book ai didi

mysql - 比为每一行创建新表更好的方法

转载 作者:行者123 更新时间:2023-11-29 02:43:13 24 4
gpt4 key购买 nike

旧数据表:

enter image description here

我想知道是否有其他方法可以对此进行优化,或者是否有不同的方法以某种方式将这两个表链接在一起。

对于我的第一个项目,这就是我(几年前)处理它的方式,现在我遇到了一个有点类似的问题,我想知道我以前做的是否是最好的......因为我有点怀疑(有点直觉我做错了)。我已经有一段时间没有使用 SQL 了,所以我的思维过程似乎没有很好地解决这个问题。

当前数据表:

enter image description here

我的问题是如何创建产品的过程与其他产品的制造过程不同,完成任务/过程的时间也不相同。

所以我的问题是,这是解决这个问题的最佳方法吗?如果没有,您介意分享一些关于如何解决这个问题的见解吗?

最佳答案

为每个产品创建单独的表是一个糟糕的设计。如果你有 10000 个产品,你必须有 10001 个表,这是噩梦。一些缺点:

  • 预计会很慢
  • 如果要向此结构添加新列,则需要更改 10000 个表
  • 针对此模式的一些非常基本的查询几乎无法编写,例如给我所有熔化过程为 1:00 的产品给我所有类型转换过程的平均时间产品

通常只创建 2 个表并使用 Foreign Key 就可以解决这个问题

一个非常简单的例子:http://sqlfiddle.com/#!9/e8175b/4 (它很草率——错误的数据类型、缺少索引、缺少约束等。但显示了这个想法):

CREATE TABLE product(
pid int primary key,
ProductName varchar(200)
);

INSERT INTO product VALUES
( 1, 'Earning001' ),( 2, 'Earning002' ),( 3, 'Necklerace001' );

CREATE TABLE Times(
product_pid int,
process varchar(100) not null,
timetoaccomplish varchar(10) not null,
constraint times_pid_kf foreign key (product_pid) references product(pid)
);

INSERT INTO Times VALUES
(1, 'Melting', '1:00'),(1, 'Casting', '2:00'),(1, 'Polishing', '0:20'),
(2, 'Melting', '1:20'),(2, 'Casting', '1:30'),(2, 'Polishing', '0:40'),
(3, 'Melting', '5:20'),(3, 'Casting', '2:15'),(3, 'Polishing', '1:45');

select * from Product;

| pid | ProductName |
|-----|---------------|
| 1 | Earning001 |
| 2 | Earning002 |
| 3 | Necklerace001 |

select * from Times;

| product_pid | process | timetoaccomplish |
|-------------|-----------|------------------|
| 1 | Melting | 1:00 |
| 1 | Casting | 2:00 |
| 1 | Polishing | 0:20 |
| 2 | Melting | 1:20 |
| 2 | Casting | 1:30 |
| 2 | Polishing | 0:40 |
| 3 | Melting | 5:20 |
| 3 | Casting | 2:15 |
| 3 | Polishing | 1:45 |

select * 
from product p
join Times t
on p.pid = t.product_pid;

| pid | ProductName | product_pid | process | timetoaccomplish |
|-----|---------------|-------------|-----------|------------------|
| 1 | Earning001 | 1 | Melting | 1:00 |
| 1 | Earning001 | 1 | Casting | 2:00 |
| 1 | Earning001 | 1 | Polishing | 0:20 |
| 2 | Earning002 | 2 | Melting | 1:20 |
| 2 | Earning002 | 2 | Casting | 1:30 |
| 2 | Earning002 | 2 | Polishing | 0:40 |
| 3 | Necklerace001 | 3 | Melting | 5:20 |
| 3 | Necklerace001 | 3 | Casting | 2:15 |
| 3 | Necklerace001 | 3 | Polishing | 1:45 |

还有一个简单的查询:给我所有进程为 Casting 且时间至少为 2:00 的产品

select * 
from product p
join Times t
on p.pid = t.product_pid
WHERE t.process = 'Casting'
AND t.timetoaccomplish >= '2:00'

| pid | ProductName | product_pid | process | timetoaccomplish |
|-----|---------------|-------------|---------|------------------|
| 1 | Earning001 | 1 | Casting | 2:00 |
| 3 | Necklerace001 | 3 | Casting | 2:15 |

关于mysql - 比为每一行创建新表更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47235660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com