質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

5回答

18465閲覧

MySQLなどのDBで2次元配列のデータを管理したい

gari

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2015/09/08 07:41

プログラム内で生成する2次元配列 をBDで管理したいと考えています。

たとえば、プログラムを実行すると2次元配列内にint型データが書き込まれていきます。
書き込むたびにDBへバックアップのような感じで、
プログラム内で2次元配列のデータを保持しつつ、DBに書き込んでいきたいです。
そして、プログラムを実行するたびに新しいテーブルを作って管理したいです。

テーブルをいくつも作成してよいのでしょうか?

調べていくとスキームというものでテーブルを管理や、indexを作るなどと
いろいろ出てきて、どうするのが一番いいのかわかりません。

DBはMySQLを使おうと思っています。
2次元配列は[100,100]ぐらいですが、今後増える可能性もあります。

FEなどの勉強でSQLはやったのですが、実際に使ったことがなくどうしたらいいか分からないです。
どなたか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/09/08 08:47

一応、仕様(?)としては 無制限に2次元配列データを管理していきたいです 1回のプログラムで生成される2次元配列を一つとして、それを何個も管理したいのですが どうすべきなのかよくわからないです。 説明が下手ですいません
anonymouskawa

2015/09/08 08:57

そうですね、プログラムでやりたいことは配列を格納したい、なのですが それに至るまでの設計が知りたいのです。 要するに、「本当に配列をそれぞれのカラムに格納しなければならないのか」等の根本的な設計を見直したいというところです。
gari

2015/09/08 09:40

なるほど、配列データを保存し、参照したいだけなので、一つのカラムに収まるのであれば一つのカラムで管理したいです。 私は、エクセルのように一つのセルに一つのデータというイメージがあって、そうやって格納するものだと思っていたのですが、 皆さんのを見てると違うようですね。
anonymouskawa

2015/09/08 09:42

テーブル1   | no int型(PK) | filename varchar(10) INDEX | name varchar(10) |番号| 2次元配列のデータファイル名 | 登録したユーザー | テーブル2   | table1_no(PK) | file_連番(PK) | 配列データ1|配列データ2|配列データ3…    この設計を仕事でやったら怒られますが、プライベートなら良いでしょう…。
gari

2015/09/08 09:55

あ、だめなんですね・・・ 私が最初に思ってたのと同じような感じです。 よろしければ実際に使われているような感じだとどのようになるのか教えていただけませんか? 仕様書などがないとだめなのでしょうか
anonymouskawa

2015/09/08 09:58

配列データ1~配列データ100っていうカラムを作っちゃうこと自体がNGです。 しかも配列データが可変だというのであればなおさらです。 >よろしければ実際に使われているような感じだとどのようになるのか教えていただけませんか? ちょい待ってくださいね。
gari

2015/09/08 15:14 編集

大変わかり易い説明ありがとうございます! 非常に勉強になりました、 そして、非常に勉強不足というのもわかりましたので これを期にもう少し勉強してみたいと思います。 他の解答してくださった方には申し訳ないのですが、 とてもわかり易い例を用意してくださったのでベストアンサーとさせていただきます。 ありがとうございました
guest

0

プログラムを実行するたびに新しいテーブルを作って管理したい

通常このような設計はあり得ません。運用の中でテーブルが増えるというのは、設計がおかしいはずです。

投稿2015/09/08 08:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/09/08 08:39

そうなのですか、 新しくDBに2次元配列のデータを格納していくにはどうしたらよいのでしょうか?
退会済みユーザー

退会済みユーザー

2015/09/08 08:51 編集

仕様に合わせって設計するしかありません。具体的な仕様を提示してください。 もしくは、現在作成しようとしているテーブルの項目を列挙するだけでも、回答者への一助になるかもしれません。
gari

2015/09/08 09:08

個人的な開発のようなものなので、仕様書などはないです。 仕様書など書いたことないのでわかりにくいかもしれませんが、 テーブル1   | no int型 | filename varchar(10) | name varchar(10) |   |番号| 2次元配列のデータファイル名 | 登録したユーザー | テーブル2   | filename varchar(10) | 配列データを格納したい | テーブル2の配列データとテーブル1のファイル名を関連付けて管理したいです。 配列データの格納方法が分からなくて困ってます。」どうしたらいいのでしょうか
退会済みユーザー

退会済みユーザー

2015/09/08 09:25 編集

CSVの構造もわからないといけませんね… というか、テーブル1だけで事足りると思うのですけど。 テーブル2がなぜ必要と思ったのでしょう? そもそも一つのカラムに「配列」を入れることはできませんが、カンマ区切りなどの文字列で入れたいということなのかな?
gari

2015/09/08 09:31

CSVですか、調べながら書いてみました   no,filename,name,data   0,201509081830,"tokumei",data[,] こんな感じでいいのでしょうか ファイルリストとデータファイル本体は分けたほうがいいと思ったのですが、ひとつでいいのですか? 2次元の配列はどうやって格納するのでしょうか 一つのカラムで格納するのですか?それとも、配列の[0,0][0,1]のようにひとつずつ作成するのでしょうか?
退会済みユーザー

退会済みユーザー

2015/09/08 09:54 編集

1項目1レコードで格納します。 この辺りの理解が難しいというのであれば、「正規化」について学習しましょう。 > data[,] はどういう意味なんでしょう?? data, data, data .... となりうるということなのでしょうか??
gari

2015/09/08 09:59 編集

正規化については理解しているつもりです… >> data[,] >はどういう意味なんでしょう?? > >data, data, data .... となりうるということなのでしょうか?? data 1行目,data 2行目 としたらよいのかと考えてみたのですが、 CSV形式にして、1行を一つのカラムに収めることはできますか?
退会済みユーザー

退会済みユーザー

2015/09/08 10:18 編集

ごめんなさい。補足を読むと余計にわかりません。 あくまで、CSVはこの4列ですか? no,filename,name,data 実データは no,filename,name,data no,filename,name,data no,filename,name,data no,filename,name,data となっているという理解であっているのですか? CSVをエクセルで開いて、ショットでも取ってくれる方がよっぽどわかりやすいと思うんですけど… > data 1行目,data 2行目 としたらよいのかと考えてみたのですが、 もしかして、「行」じゃなくて「列」の間違い?? エクセルでいうA,B,Cは「列」、1,2,3は「行」ですよ。
gari

2015/09/08 10:22

>あくまで、CSVはこの4列ですか? >no,filename,name,data > >実データは > >no,filename,name,data >no,filename,name,data >no,filename,name,data >no,filename,name,data > >となっているという理解であっているのですか? 一つのカラムに2次元配列をどのような形であれ、格納できるのであれば そうしようと思っています
退会済みユーザー

退会済みユーザー

2015/09/08 10:30 編集

> 一つのカラムに2次元配列をどのような形であれ、格納できる これ自体がナンセンスなので、無理ですよと言っているのです。 これも意味が曖昧で困っているのですが… あなたの言う2次元配列はあくまでCSVのことを言っている? 2次元配列のデータを2次元配列でDBに入れるというのは無理。 2次元配列のデータを「加工して」DBに入れるのなら可能。 だから、現状のCSVがどうなっていて、DBに入れた後でどのように利用したいのかを聞きたいのです。
gari

2015/09/08 15:21 編集

貴方とanonymouskawaさんのお陰で非常にわかりやすく理解することが出来ました。 anonymouskawaさんと同じような構造でDBを構築していきたいと思います。 まずは、仕様を決めて設計できるようにならなくてはならないのですね。。 とても勉強になりました、ありがとうございました >だから、現状のCSVがどうなっていて、DBに入れた後でどのように利用したいのかを聞きたいのです。 CSVは no,filename,name,num,dataとなります、 DBに入れた後、利用するときは元の2次元配列に入れて使おうと考えています。
guest

0

テーブルをいくつも作成してよいのでしょうか?

ふつうはやりません。

データ1件を以下のような形式にしたらいかがでしょうか?

ID+バックアップの日時+行番号+列番号+データ
または
ID+バックアップの日時+配列のバイナリデータ

投稿2015/09/08 08:50

編集2015/09/08 08:52
kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/09/08 15:23 編集

すいません、理解出来ました、 回答有難うございます
guest

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
sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/09/08 08:50

それはC#やruby、PHPでデータの書き込みや参照はできますか?
sho_cs

2015/09/09 00:24

サンプルを追記してみました。
gari

2015/09/09 07:38

ありがとうございます、参考にさせていただきます
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/09/08 15:15

シリアライズはXMLに変換して使うという感じですかね、 今後使えそうなので勉強してみたいと思います、 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問