2012-01-14 1 views
1

私は電気エンジンの降伏値を保持するデータベースを作成しています。 yield値は、データベースに転送する必要があるExcelファイルに保存されます。エンジンの各テストには、42行(トルク)と42列(電力in kw)の値が格納されています。SQL効率の行またはテーブル

(kw)   1,0  1,2 ...(42x) 
      -------- ------- 
(rpm)2000  76,2  77,0 
    2100  76,7  77,6 
     ... 
    (42x) 

さて私は(各エンジンは、複数のテストを有することができる)test_id、engine_idの列を作成する考え、対応する降伏値の42列。各テストでは、1つのエンジンに42の行を追加する必要があります。これは私にとっては効率的で簡単に実装できないようです。

1つのシングルエンジンで42個のレコード(行)がある場合、データベースは数千の行を保持し、対応する値を持つ特定のエンジンを検索するのは疲れた作業になります。

特定のエンジンのテストごとに別のテーブルを作成すると、やや時間がたっても、おそらく何千ものテーブルがあります。今何をすべきか、何千ものレコードを持つテーブルか、42列と42行のテーブル?いずれにせよ、私はまだ冗長なレコードを持っています。

答えて

4

データベースは間違いなく答え(何百万人を検索、または数百万行の百であるあなたがSQLのこつ(データベースと対話するための言語)を得れば非常に簡単です。私は

のテーブル構造をお勧めします
EngineId, TestId, TourqueId, PowerId, YieldValue 
値を持っているでしょう

...

Engine1、Test1を、2000年、1.0、73.2

だから、唯一の5列。これはあなたにそれがあるべき将来的にはより多くの収量結果を追加するための柔軟性を提供します必要な場合(またはそうでない場合でも、とにかく簡単なスキーマ)。ただし、スプレッドシートでデータベースの機能を実現するには、SQLを学ぶ必要があります。また、ExcelデータをSQLにインポートする方法はたくさんありますので、それを調べる必要があります(Googleにあります)。あなたが手ですべてのデータを転送しているとわかったら、間違ったことをしています(本当に間違っていませんが、非効率です)。

あなたのコメントにさらに

、ここでインデックスと正確なスキーマは(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、テストID、トルクであります、 力)。私は基準のそのセットのインデックスを追加した

 Select * from EngineTestResults where engineId = 'EngineABC' and TestId = 'TestA' 

注:特定のエンジンの結果を取得するには、次のようなクエリを実行します。

+0

Excelからのインポートは問題ありません。私はAce.OLEDBアダプターを使用しました。しかし、データベースそのもののデザインが私を夢中にしています – dotNes

+0

私はこの答えに同意します。@dotNes、EngineId列とTestid列にインデックスを作成すると、何百万行もある場合でもクエリがすぐに実行されます。 (あなたのdbmsが完全に不自然ではないと仮定します)。このテーブル構造では、テスト結果を列にクロス集計するためのコードを記述する必要があります。 –

+0

上記の表は意味がありますか?うまくいけば説明できるようにいくつかの値を追加します。 –

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) 
); 

その後、あなたは、単に必要な結果を返すために、これらの3つのテーブル間で結合を実行することができます。何かのように:

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; 
+0

+1:私は、エンジンが車のためであるか、エンジンがたくさんある場所にエンジンがあると思うので、その数はかなり早くSMALLINTをオーバーフローします。さらに、エンジンIDは、事実上、エンジンのIDであるシリアル番号である可能性が高い。しかし、これはトリビアです。あなたが概説している基本的な考え方は問題ありません。 –

関連する問題