- PR -

SQL Server2005 配列データの格納方法

投稿者投稿内容
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 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

King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-18 09:31
別テーブルにすれば良いのではないでしょうか。
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2009-02-18 09:52
引用:
1200byteのまま保存し、なおかつソースへの展開も容易になるような方法はありませんでしょうか?



BinaryFormatterでシリアライズ後、圧縮するとかでしょうか。。。



敢てバイナリにシリアライズしてデータベースに保存するのは、
何か特別な意図があってのことなのでしょうか?
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 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)
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2009-02-18 10:08
引用:
正規化しないことでアクセス頻度をさげ




「正規化しない」とはシリアライズしてフィールドを一つにまとめることではありません。

[ メッセージ編集済み 編集者: turutosiya 編集日時 2009-02-18 10:10 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-02-18 10:10
BynaryFormatter を使わず、BitConverter.GetBytes() メソッドを使うなどして、自分で1200バイトのバイト列を組み立てるのが手っ取り早いのでは?

引用:

あかりさんの書き込み (2009-02-18 09:58) より:

担当者いわく
客先からの要望であり、正規化しないことでアクセス頻度を下げ、レスポンスの改善はかれるということらしいです。

本当なのでしょうか?


どう使うのかわからないのでなんとも。
少なくとも、個別の値に対して検索を行う用途には向かないでしょうね。
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 2009-02-18 10:10
turutosiya様、回答ありがとうございます。

>BinaryFormatterでシリアライズ後、圧縮するとかでしょうか。。。
圧縮も手段のひとつですね。ありがとうございます。

>敢てバイナリにシリアライズしてデータベースに保存するのは、
何か特別な意図があってのことなのでしょうか?

特に理由はありません、ショートの項目を5つ含む集団項目を120配列分を1つのテーブルに保存し、取り出した際に配列として扱いたいというだけです。
それを実現する方法をほかに知らないというだけです。

よい方法がありましたら、ご教授お願いいたします。
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 2009-02-18 10:27
turutosiya様、rain様回答ありがとうございます。
>「正規化しない」とはシリアライズしてフィールドを一つにまとめることではありません。

概念スキーマ上、別テーブルにあえて分けないという意味で、正規化しないという表現を使用させていただきました。
言葉足らずで誤解を招き、失礼いたしました。

>BynaryFormatter を使わず、BitConverter.GetBytes() メソッドを使うなどして、自分で1200バイトのバイト列を組み立てるのが手っ取り早いのでは?
試してみようと思うのですが、1項目ずつ、byte型に変換し、結合していくということですよね?
byte同士の結合はどうすればできるのでしょうか?

>どう使うのかわからないのでなんとも。
少なくとも、個別の値に対して検索を行う用途には向かないでしょうね。
個別の値に対して検索は使用しないとのことでした。

スキルアップ/キャリアアップ(JOB@IT)