2017-10-25 12 views
1

私はこの質問をフレーズする最善の方法はわかりません!回転するデータを持つmysqlデータベース

私は過去24データ値を取得して保存する必要があるmysqlデータベースを持っており、データは常に最後の24データ値である必要があります。

これは完全に機能していますが、これを行うにはより良い方法が必要です。

はちょうど今、私のmysqlデータベースには、IDの列、タイムスタンプなどして、24個のデータの列があります。

data_01 
data_02 
data_03 
data_04 
data_05 
etc 

異なるIDに対して複数の行があります。

私は列 'data_24' を削除し、その後、すべての列の名前を変更し、毎時間、cronジョブを実行します。

data_01 -> data_02 
data_02 -> data_03 
data_03 -> data_04 
data_04 -> data_05 
data_05 -> data_06 
etc 

そして新しい、空白の列追加:

data_01 

新をデータがこの新しい空の列に追加されます。

これは賢明な方法のように聞こえるのですか、それとももっと良い方法がありますか?

このメソッドの問題は、新しいデータが取得される前に列の削除、名前の変更、追加が最初に行われ、データを追加するための新しい列が存在することです。

何らかの理由でデータの取得に失敗した場合、myテーブルにはデータ値としてNULLの列が含まれます。

+0

あなたはLIMITを使用して最後の24レコードを収集するビューを使用しますか? –

+0

あなたは常にデータを収集して保存することを意味し、最後の24だけを表示しますか?これは非常に迅速に手に入らず、非常に多くのデータを収集します。私は最後の24だけが必要なので、すべてのデータを保持するのは無駄です。 – Richard

+0

更新/挿入されたdata_01のデータはどこにありますか?あなたは自己結合を行い、data_24 = data_23などからデータをロールすることができます。値data_01を更新して渡す。水平型の店舗は、垂直型よりも挑戦的です。 – xQbert

答えて

2

このような列の名前を変更することはお勧めできません。

このデータを挿入して更新する方法が不思議ですが、これを行うにはより良い方法が必要です。実現可能なように見える

2つのこと:

は、列の名前を変更しますが、次の列にデータを移動しない:

update YourTable 
    set data1 = :newvalue, 
     data2 = data1, 
     data3 = data2, 
     ...; 

またはその代わりに24列を持っていることの24行を介してデータを広げることもできます。各データは、テーブル内の行(または、IDが外部キーである新しいテーブル)です。新しい値を挿入するたびに、同じIDの最も古い値を削除することもできます。 1つのアトミックなトランザクションでこれを行うことができるので、IDごとに24行以上またはそれ以下の行はありません。 1000行(あなたが言及したように)のために、あなたが持っている場合は、まだピーナッツは約24000行を、話しているよう

insert into YourTable(id, data) 
values (:id, :newvalue); 

delete from YourTable 
where id = :id 
order by timestamp desc 
limit 1; 

これは、24で行数(ただしデータ量)を掛けます適切なインデックス。

1億以上の行を持つMySQLでテーブルを取得しました。 24000行を操作することは、1000行の完全な表を書き直すよりも簡単です。これは基本的には列の名前を変更して実行しています。

したがって、2番目のオプションは確かに私の好みを持っています。シンプルな構造を提供します。古いデータをクリーンアップしたり、別のジョブに移動したり、24個の代わりに100個のアイテムに移動したりする場合は、3行のコードを変更して簡単に行うことができますテーブル構造とアプリケーションを完全にオーバーホールする代わりに。

+0

私はテーブルに1000以上の行があるので、最良の方法は列として24のデータエントリを持つことです。新しいデータは、APIからのJSON呼び出しから取得されます。 IDは固定されているので、UPDATE WHERE id = 'id'コマンドを使用して 'data_01'列に新しいデータを挿入するだけです。 – Richard

+0

私の最初の提案を選択することを歓迎しますが、24000行はまだMySQLのためのピーナッツであり、実際にはテーブルを変更するより簡単です(MySQLがバックグラウンドで一時テーブルを作成し、データのリネーム、テーブルの削除、古いテーブルの削除) – GolezTrol

0

正直言って、それは賢明なやり方ではありません。

IMHOでは、ワイドテーブルではなく複数の行を使用する方がずっと柔軟です。

カラム(id、entity_id、created)を定義できます。その後、あなたの記録を「ログ」形式で書くことができます。

以前と同じ方法でデータを選択する必要がある場合は、そのためにMySQLビューを使用できます。何かのように

CREATE VIEW my_view AS 
    SELECT data_01, ..., data_24 -- here you should put the aggregated values aliased as data_01 ... data_24 
    FROM my_table 
    WHERE my_table.created >= DATE_SUB(NOW(), INTERVAL 1 DAY) 
    GROUP BY ... -- here you should aggregate the fields by hours 
    ORDER BY created; 
関連する問題