2017-11-16 6 views
0

別のテーブルの行をグループ化する目的で、単一の列を持つテーブルを使用するのは一般的なケースですか?グループ分けのテーブル

データをバッチで挿入していますが、生成されたIDに基づいてデータをグループ化できるようにするために、それぞれのバッチに対して自動インクリメントキーが必要です。

は、具体的には、私はそう基本的にB(非正規化)にタイムスタンプを移動し、唯一のグループ化のための外部キーを使用し

A 
id, x, y, timestamp, b_id 
id PRIMARY KEY 
b_id FOREIGN KEY REFERENCES B.id 

B 
id 
id PRIMARY KEY 

SELECT count(*) as number, A.timestamp FROM A 
         where A.x='value' and A.y='value' 
         group by A.b_id, A.timestamp; 

にこの

A 
id, x, y, b_id 
id PRIMARY KEY 
b_id FOREIGN KEY REFERENCES B.id 

B 
id, timestamp 
id PRIMARY KEY 

SELECT count(*) as number, B.timestamp FROM A inner join B on A.b_id=B.id 
        where A.x='value' and A.y='value' 
        group by B.id; 

から取得したいです。私は、Bに配置されたタイムスタンプに対してのみ参加することを避けたいと考えています。テーブルはかなり大きく(60M行)、参加は非常に遅いです。私がまだAをフィルタリングし、グループ化のためにのみ外部キーを持っていれば、それは多くのことをスピードアップします。

具体的には、MySQLを使用しています。

+0

テーブルの構造とサンプルデータによって、質問がより明確になる場合があります。また、どのようなSQLのフレーバーを使用しています。このようにグループに含まれていない列を選択項目に含めれば、通常は許可されません。 –

+0

@TomH私の答えを編集しました。あなたはそれを確認できますか? – Marko

答えて

0

パフォーマンスの理由から非正規化が許容されます。パフォーマンスの向上がその非正規化のコストを上回ることを確認してください。追加の領域要件(それ自体のパフォーマンス問題を引き起こす可能性がある)だけでなく、潜在的なデータエラーのコストもコストになります。たとえば、2つの行が同じ "b_id"のタイムスタンプ値を持つテーブル "A"に終わると、

+0

答えをありがとう。 "b_idとtimestampが同じバッチ内のすべての要素に対して常に同じ値であるため、同じ" b_idでタイムスタンプの値が異なる "2つの行がテーブル" A "になります。何が起こるかは同じタイムスタンプを持つ複数のバッチを持つことですが、これはまさに私がテーブルBとb_idを導入する理由です。意味がある、はい? – Marko

+1

はい、それは理にかなっていますが、異なるタイムスタンプ値を持つ同じb_idが*起こらないと明示されます。誰もがバグのないコードを書いている世界では、あなたはすべて設定されています。 ;) –

+0

はい私の場合はb_idがバッチ用に生成されたautoincrementなので、私は同意します。しかし、タイムスタンプと複数のプロデューサだけがデータベースに書き込むだけでは、同じタイムスタンプを持つ複数の行が発生し、カウントを行う際に問題が発生する可能性があります。同意しますか? :) – Marko

関連する問題