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

标签 mysql sql

旧数据表:

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/

相关文章:

php - 如何在 HTML 表中显示 MySQL 查询的结果

c# - 具有分组依据的 Linq 查询

mysql - SQL - 根据unix时间戳总结每天字段的内容

sql - 使用 SQL Server 查找表中的重复记录

mysql - 大型 MySQL 数据库中的重复项

Mysql - 坚持所有行的单行值?

java - 如何在 JUnit 测试容器中的 MySQLContainer 中导入 sql 转储文件

php - 非拉丁字符串的 SELECT 查询通过 phpMyAdmin 起作用,但不适用于搜索表单

PHP/HTML/JavaScript : Automatically leave page?

sql - 如何使用 SQL 在 Informix 中列出特定数据库的模式?