プログラム内で生成する2次元配列 をBDで管理したいと考えています。
たとえば、プログラムを実行すると2次元配列内にint型データが書き込まれていきます。
書き込むたびにDBへバックアップのような感じで、
プログラム内で2次元配列のデータを保持しつつ、DBに書き込んでいきたいです。
そして、プログラムを実行するたびに新しいテーブルを作って管理したいです。
テーブルをいくつも作成してよいのでしょうか?
調べていくとスキームというものでテーブルを管理や、indexを作るなどと
いろいろ出てきて、どうするのが一番いいのかわかりません。
DBはMySQLを使おうと思っています。
2次元配列は[100,100]ぐらいですが、今後増える可能性もあります。
FEなどの勉強でSQLはやったのですが、実際に使ったことがなくどうしたらいいか分からないです。
どなたか教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
極論で言っちゃあ、こういう構造で良いわけです
CSVファイルは、
date1,date2,date3,date4,date5・・・・・date100
の項で、100行並んでるとします。
プログラムで登録をした時、このテーブルにはファイル名と登録日、登録ユーザと各行をnumに持ち、dataにCSVファイルの一行をそのまま突っ込んでしまうのです。
2次元配列に戻す時はプログラム側で戻せば良いでしょう。
ただ、これだとdata[10,50]を取りたい時に即座には取れません。
私達はCSVファイルの項目がdate100以上あるかどうかが質問からはわからない(増える想定とか曖昧)のでこうせざるを得ないのでは?
という憶測で回答しています。
テーブルのカラムは可変とはいえそうホイホイ変わるものじゃないので、可変を扱いたいならこういれるしかないよねって感じです。
例えばなのですが、この仕様が
1)サイコロをn回振って出た目を配列に格納する
2)n回降る動作を一気にm人で行ったので、1の結果と合わせて二次元配列で管理する
3)2の結果をDBに保存したい
ただし、0 <= n <=300, 0<=m<=300とします
こういう仕様であれば、回答者も割りと納得して回答してくれると思います。
Excelとの違いなんですけれど、Excelのセルには「なんでも有り」ですよね。
A列、B列という曖昧な名前でそれぞれの列に意味はありません。
あくまで表計算であって、データを保存するためのセルではないのですよね。
私達がイメージするリレーショナルデータベースとは整合性が取れた、データの塊です。
都道府県市区町村テーブルには自宅の電話番号は入っていないですし、
顧客テーブルに自社製品の品物名や在庫数は入らないです。
Excelもそうなのですが2次元配列というのは、正直「それぞれの位置には意味を持っていない」と判断してしまうのです。
data[n,1]は氏名だ、と言われてもわからないのです。
わからないものをデータベース化して!っていうのは、割りと困難なのです。
テーブル上限については、3000を目安にしたほうがよいとのことですが、3000もテーブルを作るシステムは使い勝手も悪くなるでしょう。
漢(オトコ)のコンピュータ道
二次元配列を格納するはMySQLにとって非常に簡単でしょうし、100件ならPKもINDEXもいらないでしょう。速度的に。
しかし、それが正しい設計かと言われるとNOです。
もう少しやりたいことが具体的であるとこちらも提案しやすいのですが、いかがでしょう。
投稿2015/09/08 08:29
編集2015/09/08 10:56総合スコア856
0
プログラムを実行するたびに新しいテーブルを作って管理したい
通常このような設計はあり得ません。運用の中でテーブルが増えるというのは、設計がおかしいはずです。
投稿2015/09/08 08:28
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/09/08 08:51 編集
2015/09/08 09:08
退会済みユーザー
2015/09/08 09:25 編集
2015/09/08 09:31
退会済みユーザー
2015/09/08 09:54 編集
2015/09/08 09:59 編集
退会済みユーザー
2015/09/08 10:18 編集
2015/09/08 10:22
退会済みユーザー
2015/09/08 10:30 編集
2015/09/08 15:21 編集
0
テーブルをいくつも作成してよいのでしょうか?
ふつうはやりません。
データ1件を以下のような形式にしたらいかがでしょうか?
ID+バックアップの日時+行番号+列番号+データ
または
ID+バックアップの日時+配列のバイナリデータ
投稿2015/09/08 08:50
編集2015/09/08 08:52総合スコア985
0
PostgreSQLであれば多次元配列を扱える型が存在するので都度行追加で対応できます。
登録・参照は以下の様な感じで可能です。
sql
1CREATE TABLE postmd 2( 3 id serial NOT NULL, 4 matrix integer[][] 5)
c#
1using (var con = new NpgsqlConnection(connectionString)) 2{ 3 var value = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } }; 4 con.Open(); 5 var insert = new NpgsqlCommand(@"INSERT INTO postmd (matrix) VALUES (:v)", con); 6 insert.Parameters.Add(new NpgsqlParameter("v", value)); 7 insert.ExecuteNonQuery(); 8 9 var select = new NpgsqlCommand(@"SELECT id,matrix FROM postmd", con); 10 var dr = select.ExecuteReader(); 11 while (dr.Read()) 12 { 13 Console.WriteLine("============="); 14 Console.WriteLine("id = {0}", dr[0]); 15 var matrix = (int[,])dr[1]; 16 17 for (int i = 0; i < matrix.GetLength(0); i++) 18 { 19 for (int j = 0; j < matrix.GetLength(1); j++) 20 { 21 Console.Write(matrix[i, j]); 22 } 23 Console.WriteLine(); 24 } 25 Console.WriteLine("============="); 26 } 27}
投稿2015/09/08 08:44
編集2015/09/09 00:24総合スコア3541
0
2次元配列やそれ以上の構造体でも、
シリアライズしてしまえば一つのデータの塊になるので、
データベースに構造まるごと保存することはできます。
特定の要素だけ読んで書き換えるというのには不向きですが、
まるごとデータベースから読み込んで、
特定の要素を入れ替えて、
まるごとデータベースに保存する、
という手順ならできますよね。
(処理速度は遅いかもしれませんが。)
シリアル化 (C# および Visual Basic)
https://msdn.microsoft.com/ja-jp/library/ms233843.aspx
シリアライズとは|serialize|シリアライゼーション - 意味/解説/説明/定義 : IT用語辞典
http://e-words.jp/w/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA.html
投稿2015/09/08 10:41
退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/08 08:47
2015/09/08 08:57
2015/09/08 09:40
2015/09/08 09:42
2015/09/08 09:55
2015/09/08 09:58
2015/09/08 11:09
2015/09/08 15:14 編集