我正在创建一个保存电动机屈服值的数据库。屈服值存储在Excel文件中,我必须将其传输到数据库。发动机的每次测试都有42行(扭矩)和42列(功率单位为kw),其值存储在这些单元格中。
(kw) 1,0 1,2 ...(42x)
-------- -------
(rpm)2000 76,2 77,0
2100 76,7 77,6
...
(42x)
我想到为engine_id,test_id(每个引擎可以有多个测试)创建一个列,并为相应的yield值创建42列。对于每个测试,我必须为单个引擎添加42行并使用yield值。这对我来说似乎没有效率,也不容易实现。
如果单个引擎有42条记录(行),那么数据库将占用几千行,并且搜索具有相应值的特定引擎将是一项令人筋疲力尽的任务。
如果我为特定引擎的每个测试做一个单独的表,再过一段时间后,我可能会有数千个表。现在我该怎么做,一个包含数千条记录的表或一个包含42列和42行的表?无论哪种方式,我仍然有冗余记录。
答案 0 :(得分:4)
数据库绝对是答案(一旦你掌握了SQL(用于与数据库交互的语言),搜索数百万或数亿行非常容易。我建议使用
EngineId, TestId, TourqueId, PowerId, YieldValue
哪个会有价值......
Engine1,Test1,2000,1.0,73.2
所以只有5列。如果需要,这将使您可以灵活地添加更多的产量结果(或者即使它不是,它只是一个更简单的模式)。但是,您需要学习SQL,以通过电子表格实现数据库的强大功能。此外,有许多技术可以将Excel数据导入SQL,因此您应该对其进行调查(Google it)。如果你发现你正在手动传输所有数据,那么你做错了(真的没错,但效率低!)。
除了您的评论之外,这里还有索引的确切模式(在MS SQL Server中)
CREATE TABLE [dbo].[EngineTestResults](
[EngineId] [varchar](50) NOT NULL,
[TestId] [varchar](50) NOT NULL,
[Tourque] [int] NOT NULL,
[Power] [decimal](18, 4) NOT NULL,
[Yield] [decimal](18, 4) NOT NULL,
CONSTRAINT [PK_EngineTestResults] PRIMARY KEY CLUSTERED
(
[EngineId] ASC,
[TestId] ASC,
[Tourque] ASC,
[Power] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Index [IX_EngineTestResults] Script Date: 01/14/2012 14:26:21 ******/
CREATE NONCLUSTERED INDEX [IX_EngineTestResults] ON [dbo].[EngineTestResults]
(
[EngineId] ASC,
[TestId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
请注意,没有递增的主键...键是(EngineId,TestId,Torque,Power)。要获取特定引擎的结果,您将运行如下查询:
Select * from EngineTestResults where engineId = 'EngineABC' and TestId = 'TestA'
请注意,我已为该组标准添加了索引。
答案 1 :(得分:1)
关系数据库的优势在于能够跨多个表规范化数据,因此您可以为引擎创建一个表,一个用于测试,一个用于结果。如下所示:
CREATE TABLE tbl__engines (
`engine_id` SMALLINT UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY(engine_id)
);
CREATE TABLE tbl__tests (
`test_id` INT UNSIGNED NOT NULL,
`engine_id` SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY(test_id),
FOREIGN KEY(engine_id) REFERENCES tbl__engines(engine_id)
);
CREATE TABLE tbl__test_result (
`result_id` INT UNSIGNED NOT NULL,
`test_id` INT UNSIGNED NOT NULL,
`torque` INT NOT NULL,
`power` DECIMAL(6,2) NOT NULL,
`yield` DECIMAL(6,2) NOT NULL,
FOREIGN KEY(test_id) REFERENCES tbl__tests(test_id)
);
然后,您只需在这三个表中执行连接即可返回所需的结果。类似的东西:
SELECT
*
FROM `tbl__engines` e
INNER JOIN `tbl__tests` t ON e.engine_id = t.engine_id
INNER JOIN `tbl__results` r ON r.test_id = t.test_id;