SQL效率行或表

  • 本文关键字:效率 SQL sql database
  • 更新时间 :
  • 英文 :


我正在创建一个保存电动发动机产量值的数据库。收益率值存储在Excel文件中,我必须将其传输到数据库中。发动机的每个测试都有42行(扭矩)和42列(功率,单位为千瓦),这些值存储在这些单元格中。

(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行。这在我看来既不高效也不容易实现

如果一个引擎有42条记录(行),那么在一段时间内,数据库将容纳数千行,搜索具有相应值的特定引擎将是一项艰巨的任务。

如果我为特定引擎的每个测试制作一个单独的表,那么过一段时间后,我可能会有数千个表。现在,我应该选择什么,一个有数千条记录的表,还是一个有42列42行的表?不管怎样,我仍然有多余的记录。

数据库绝对是答案(一旦掌握了SQL(与数据库交互的语言),搜索数百万或数亿行就非常容易了。我推荐的表格结构

EngineId, TestId, TourqueId, PowerId, YieldValue

哪个会有价值。。。

发动机1,测试1,2000,1.0,73.2

所以只有5列。这将为您提供灵活性,以便在未来需要时添加更多的yield结果(或者即使不是,它也只是一个更简单的模式)。然而,您需要学习SQL,才能实现数据库相对于电子表格的强大功能。此外,还有许多将Excel数据导入SQL的技术,因此您应该对此进行研究(谷歌搜索)。如果你发现你在手动传输所有数据,那么你就做错了什么(不是真的错,而是效率低下!)。

根据您的评论,以下是带有索引的确切模式(在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'

请注意,我已经为这组标准添加了一个索引。

关系数据库的优势在于能够跨多个表规范化数据,因此您可以有一个表用于引擎,一个用于测试,另一个用于结果。类似以下内容:

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;

最新更新