爲每個產品創建單獨的表是一個糟糕的設計。 如果你有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 |
正常化,不是掌握最簡單的概念,而是一個像樣的課本或教程一兩個小時應該得到你最的方式存在。 – Strawberry
好吧,我會去審查,並給它一個鏡頭,我知道這個概念,但可能有一些細節,我想我錯過了。 – drasmus
所以我猜想會發生什麼事是使用交叉引用數據生成單個大規模(非規格化)表(A001I001,A001I002)的唯一標識符?然後,當我查詢特定區域時,我只是在我的過濾器(A001) – drasmus