2017-11-11 18 views
2

表:比更好的方法來創建新表的每一行的舊數據

enter image description here

我想知道是否有其他方法來優化這種或是否有這2個表連接在一起的一種不同的方法不知何故。

對於我的第一個項目,這是我如何接近它(幾年前),現在我遇到了一個類似的問題,我想知道我以前做的是最好的...因爲我有點懷疑(有點直覺,我做錯了)。我有很長一段時間沒有完成SQL,所以我的思考過程似乎沒有爲這個問題做得很好。當前數據

表:

enter image description here

我的問題是,如何創造產品的過程是不一樣的其他產品是如何作出的,而時間來完成任務/ proccesses也不一樣。

所以我的問題是,這是解決這個問題的最好方法嗎?如果不是,你是否介意分享一些關於如何解決這個問題的見解?

+2

正常化,不是掌握最簡單的概念,而是一個像樣的課本或教程一兩個小時應該得到你最的方式存在。 – Strawberry

+0

好吧,我會去審查,並給它一個鏡頭,我知道這個概念,但可能有一些細節,我想我錯過了。 – drasmus

+0

所以我猜想會發生什麼事是使用交叉引用數據生成單個大規模(非規格化)表(A001I001,A001I002)的唯一標識符?然後,當我查詢特定區域時,我只是在我的過濾器(A001) – drasmus

回答

1

爲每個產品創建單獨的表是一個糟糕的設計。 如果你有10000個產品,你必須有10001個表,這是噩夢。有幾個缺點:

  • 預計,如果你想要一個新的列到這個結構需要改變10000個表
  • 根據該模式的一些非常基本的查詢,實際上immposibile以很慢
  • 寫,例如給我所有的產品,其中熔proccess是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 | 

和一個簡單的查詢:給我所有的產品,其中的過程是鑄造和時間是至少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 | 
+0

中使用適當的區域ID。所以我猜想像processXtime的唯一鍵是要走的路(或者我應該使它成爲ItemXProcessXTime?) 。每當有新材料或新過程時,它看起來都比改變模式好看多了。 – drasmus

相關問題