2017-08-08 81 views
1

我想創建一個產品表。本產品具有獨特的部件號。但是,每個零件號具有不同數量的以前的零件號,以及可以使用該零件的各種機器數量。如何設計一個字段有很多描述的SQL表

例如,對於部分沒有說明: AA1007

上部分不: AA1001,AA1002,AA1004,AA1005,...

機品牌:博世,盈得喜,薩姆鬆,熱點,夏普,...

機器品牌型號:博世A1,博世A2,博世A3,Indesit A1,Indesit A2,....

我想爲此創建一個表格,但我不知道如何繼續。我能夠想到的是爲上一個零件號,機器品牌,機器品牌模型分別創建一個表格。

問題:什麼是設計這些表的正確方法?

+0

您可能需要一大堆表格。你應該閱讀SQL關係。多對一,多對多 –

+0

映射表... – Milney

+0

PartSynonyms表或許?當前零件編號位於「零件」表中,其中PartSynonyms列出主零件ID以及該零件每個同義詞的單個記錄。 – xQbert

回答

2

當然有不同的方式來設計表格。一個非常基本的方法是:

您可以創建如下所示的表格。我添加了列ValidFromValidTill,以確定零件在哪個時間處於活動/正在使用狀態。 這取決於你的數據,如果數據類型date就夠了,或者你需要datetime才能更準確。

CREATE TABLE Parts 
(
     ID   bigint NOT NULL 
    ,PartNo  varchar(100) 
    ,PartName  varchar(100) 
    ,ValidFrom  date 
    ,ValidTill  date 
) 

CREATE TABLE Brands 
(
     ID   bigint NOT NULL 
    ,Brand   varchar(100) 
) 

CREATE TABLE Models 
(
     ID   bigint NOT NULL 
    ,BrandsID  bigint NOT NULL 
    ,ModelName  varchar(100) 
) 


CREATE TABLE ModelParts 
(
     ModelsID  bigint NOT NULL 
    ,PartID  bigint NOT NULL 
) 

填寫您的數據,如:

INSERT INTO Parts VALUES 
(1,'AA1007', 'Screw HyperFuturistic', '2017-08-09', '9999-12-31'), 
(1,'AA1001', 'Screw Iron',    '1800-01-01', '1918-06-30'), 
(1,'AA1002', 'Screw Steel',    '1918-07-01', '1945-05-08'), 
(1,'AA1004', 'Screw Titanium',   '1945-05-09', '1983-10-05'), 
(1,'AA1005', 'Screw Futurium',   '1983-10-06', '2017-08-08') 


INSERT INTO Brands VALUES 
(1,'Bosch'), 
(2,'Indesit'), 
(3,'Samsung'), 
(4,'HotPoint'), 
(5,'Sharp') 


INSERT INTO Models VALUES 
(1,1,'A1'), 
(2,1,'A2'), 
(3,1,'A3'), 
(4,2,'A1'), 
(5,2,'A2') 

INSERT INTO ModelParts VALUES 
(1,1) 

要選擇特定日期的所有部分(在這種情況下,2013年3月3日)的 「博世A1」 的:

DECLARE @ReportingDate date = '2013-03-03' 

     SELECT B.Brand 
       ,M.ModelName 
       ,P.PartNo 
       ,P.PartName 
       ,P.ValidFrom 
       ,P.ValidTill 
      FROM Brands B 
    INNER JOIN Models M 
      ON M.BrandsID = B.ID 
    INNER JOIN ModelParts MP 
      ON MP.ModelsID = M.ID 
    INNER JOIN Parts P 
      ON P.ID = MP.PartID   
      WHERE B.Brand   = 'Bosch' 
      AND M.ModelName  = 'A1' 
      AND P.ValidFrom  <= @ReportingDate 
      AND P.ValidTill  >= @ReportingDate  

當然,有幾種方法可以對數據進行歷史記錄。 ValidFrom和ValidTill(ValidTo)是我的最愛之一,因爲您可以輕鬆完成歷史報告。 不幸的是,你必須處理歷史記錄:當插入一個新行時(例如你的螺絲釘),你必須在插入新行之前設置ValidTill列來「關閉」舊記錄。此外,你必須開發邏輯來處理刪除...

那麼,這是一個相當大的話題。你會在萬維網上發現大量的信息。

+0

謝謝。這就是我的想法。感謝您澄清事情。然而,我的零件號碼並不明確。請注意,它們都是相同的零件(例如,它們都是相同的螺絲),但是零件編號已經改變。所以我需要跟蹤這些零件號碼。 @Tim Biegeleisen提供的解決方案非常有意義,但我無法弄清楚如何添加新的以前的零件編號。在這種情況下,我添加的以前的部件號將是最新的。你有其他解決方案來跟蹤這個嗎? –

+0

@HappyForever我剛剛更新了我的文章。我刪除了Partent/Child邏輯,並將時間段添加到Parts表中。這可能是你一直在尋找的 –

+0

是的,這是我一直在尋找。我不確定在兩個領域使用這麼多桌子是否是一個好習慣,現在我知道這是一個很好的做法。但是,如果有這麼多的表,我不知道如何更新所有連接的字段。我想我會問這是一個不同的問題。 –

2

有關部件號表,可以考慮以下建議:

id | part_no | time_created 
1 | AA1007 | 2017-08-08 
1 | AA1001 | 2017-07-01 
1 | AA1002 | 2017-06-10 
1 | AA1004 | 2017-03-15 
1 | AA1005 | 2017-01-30 

換句話說,你可以添加一個datetime列哪個版本的每個部件編號。請注意,我在這裏添加了一個主鍵id列,該列在一段時間內保持不變,並跟蹤每個零件,儘管零件號可能會更改。

對於與時間無關的查詢,您可以使用id列加入此表。但是,部件號也可能作爲外鍵。如果您是從以前的日期生成發票,那麼您可能會在當時查找適當的部件號,然後使用該部件號連接到一個或多個表。

對於您提到的其他表格,我沒有看到類似的要求。

+1

6小時6分5秒。再多一秒鐘,你就會過得很快樂。可行的答案。我喜歡它來管理部分報廢並且仍然有先前的數據;但如果它不是過時的活動,那麼我們可能需要一個帶有父子層次結構或同義詞的子表,但這適用於某些用例。 – xQbert

+0

謝謝你的回答。這是以前的零件號碼錶的一個很好的解決方案。但是,時間戳會自動創建。那麼,如果我想調整以前的零件號碼,即添加另一個零件號碼,請更改當前零件號碼? –

+0

我沒想到以前的零件表,只有一個表,其中包含_all_零件號,當前和以前。你可以隨時識別當前的一個,所以你甚至可能不需要爲以前的單獨的表。根據你的喜好添加和刪除(如果你有其他需求,這個評論可能會改變)。 –