2017-08-08 96 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_零件号,当前和以前。你可以随时识别当前的一个,所以你甚至可能不需要为以前的单独的表。根据你的喜好添加和删除(如果你有其他需求,这个评论可能会改变)。 –