- - PR -
SQL Server2005 配列データの格納方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-02-18 09:15
SQL Server2005初心者です。
配列を設定したければ、シリアライズし、バイト配列を格納すればよいということはわかったのですが、このやり方だとサイズが大きくなってしまうため困ってしまいました。 ショートの項目を5つ含む集団項目を120配列分を1つのテーブルに保存したいと考えています。 本来ならshort*5=10byte, 10byte*120 = 1200byteのサイズですみます。 しかし、以下のTestクラスをListクラスを使用し、連想配列として120個準備し、BinaryFormatterを使用してbyte配列を保存すると、3262byteまで膨れ上がってしまいます。 type情報も保持しているので、当然なのですが、1200byteのまま保存し、なおかつソースへの展開も容易になるような方法はありませんでしょうか? Public Class Test Public kizu As Short Public dai As Short Public syo As Short Public sen As Short Public tokyu As Short End Class | ||||
|
投稿日時: 2009-02-18 09:31
別テーブルにすれば良いのではないでしょうか。
| ||||
|
投稿日時: 2009-02-18 09:52
BinaryFormatterでシリアライズ後、圧縮するとかでしょうか。。。 敢てバイナリにシリアライズしてデータベースに保存するのは、 何か特別な意図があってのことなのでしょうか? | ||||
|
投稿日時: 2009-02-18 09:58
King様解答ありがとうございます。
私もまったく持ってそのとおりだと思います。 担当者いわく 客先からの要望であり、正規化しないことでアクセス頻度を下げ、レスポンスの改善はかれるということらしいです。 本当なのでしょうか? 現在のコードです、MySerializeはBynaryFormatterを使用した、自作関数です。 構造体を使用すると、2477Byteになりました。 Dim t(119) As Test2 Dim b() As Byte For i As Integer = 0 To 119 t(i) = New Test2 Next For i As Integer = 0 To 119 t(i).kizu = i t(i).dai = i t(i).syo = i t(i).sen = i t(i).tokyu = i Next b = MySerialize(t) Debug.WriteLine(b.Length) | ||||
|
投稿日時: 2009-02-18 10:08
「正規化しない」とはシリアライズしてフィールドを一つにまとめることではありません。 [ メッセージ編集済み 編集者: turutosiya 編集日時 2009-02-18 10:10 ] | ||||
|
投稿日時: 2009-02-18 10:10
BynaryFormatter を使わず、BitConverter.GetBytes() メソッドを使うなどして、自分で1200バイトのバイト列を組み立てるのが手っ取り早いのでは?
どう使うのかわからないのでなんとも。 少なくとも、個別の値に対して検索を行う用途には向かないでしょうね。 | ||||
|
投稿日時: 2009-02-18 10:10
turutosiya様、回答ありがとうございます。
>BinaryFormatterでシリアライズ後、圧縮するとかでしょうか。。。 圧縮も手段のひとつですね。ありがとうございます。 >敢てバイナリにシリアライズしてデータベースに保存するのは、 何か特別な意図があってのことなのでしょうか? 特に理由はありません、ショートの項目を5つ含む集団項目を120配列分を1つのテーブルに保存し、取り出した際に配列として扱いたいというだけです。 それを実現する方法をほかに知らないというだけです。 よい方法がありましたら、ご教授お願いいたします。 | ||||
|
投稿日時: 2009-02-18 10:27
turutosiya様、rain様回答ありがとうございます。
>「正規化しない」とはシリアライズしてフィールドを一つにまとめることではありません。 概念スキーマ上、別テーブルにあえて分けないという意味で、正規化しないという表現を使用させていただきました。 言葉足らずで誤解を招き、失礼いたしました。 >BynaryFormatter を使わず、BitConverter.GetBytes() メソッドを使うなどして、自分で1200バイトのバイト列を組み立てるのが手っ取り早いのでは? 試してみようと思うのですが、1項目ずつ、byte型に変換し、結合していくということですよね? byte同士の結合はどうすればできるのでしょうか? >どう使うのかわからないのでなんとも。 少なくとも、個別の値に対して検索を行う用途には向かないでしょうね。 個別の値に対して検索は使用しないとのことでした。 |