当然有不同的方式来设计表格。一个非常基本的方法是:
您可以创建如下所示的表格。我添加了列ValidFrom
和ValidTill
,以确定零件在哪个时间处于活动/正在使用状态。 这取决于你的数据,如果数据类型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列来“关闭”旧记录。此外,你必须开发逻辑来处理删除...
那么,这是一个相当大的话题。你会在万维网上发现大量的信息。
您可能需要一大堆表格。你应该阅读SQL关系。多对一,多对多 –
映射表... – Milney
PartSynonyms表或许?当前零件编号位于“零件”表中,其中PartSynonyms列出主零件ID以及该零件每个同义词的单个记录。 – xQbert