web-dev-qa-db-ja.com

数値の配列をデータベースフィールドに保存

コンテキスト:SQL Server 2008、C#

整数の配列(0-10要素)があります。データは頻繁には変更されませんが、頻繁に取得されます。

数値を格納する別のテーブルを作成することもできますが、何らかの理由でそれが最適ではないと思われます。

質問#1:配列を別のテーブルに保存する必要がありますか?理由を教えてください。

質問#2:(Q#1への回答が何であるかに関係なく)、データベースフィールドにint []を格納する「最良の」方法は何ですか? XML? JSON? CSV?

編集:一部の背景:保存される数値は、関係に関与しない係数の一部であり、常に配列として使用されます(つまり、値が取得されたり、単独で使用されたりすることはありません)。

21
THX-1138

データベースにデータを保存する「最善の」方法は、データベースで実行される操作に最も役立つ方法であり、メンテナンスを最も簡単にする方法です。この後者の要件により、関係を持つテーブルに整数を格納することを意味する正規化されたソリューションが得られます。更新が簡単なだけでなく、情報の保存方法と保存方法を理解する次の開発者にとっても、より簡単です。

12
Thomas

正規化された個別のテーブル

XMLやjsonとしてではなく、個別の行に個別の数値

どう考えても、それが最善の方法です。後で感謝します

41
gbn

それをJSON配列として保存しますが、すべてのアクセスは配列全体に対して行われることに注意してください。特定の係数に対する個別の読み取り/書き込みはありません。

私たちのケースでは、それらをjson配列として格納しています。あなたの場合と同様に、個々の配列番号の間に関係はありません-配列はユニットとしてのみ意味があり、ユニットとしては、テーブル内の他の列と関係があります。ちなみに、他のすべてはIS正規化されています。私はこれに似ています:10バイトのチャンクを格納する場合は、VARBINARY(10)の単一の列にパックして保存します。10バイトに分割し、それぞれをVARBINARY(1)の列に格納してから、外部キーを使用してそれらをステッチすることはできません。つまり、可能ですが、意味がありません。

開発者としてのあなたは、そのintの配列が実際にどのように「一体」であるかを理解する必要があります。

5
DeepSpace101

これを行うには、別のテーブルが最も「正規化された」方法になります。そして、各整数を抽出するために列の値を解析する必要がないため、おそらくそれは長期的にはより優れています。

必要に応じて、 XML列 を使用してデータを保存することもできます。

スパース列 もあなたにとって別のオプションかもしれません。

本当にシンプルにしたい場合は、値を区切るだけです:10;2;44;1

3
Josh M.

あなたのアプリがデータ駆動型アプリケーションである可能性があることを示すSQLサーバーについて話しているので、私は思います。その場合は、配列をデータベース内に確実に保持し、各値のレコードを持つ個別のテーブルとして保持します。それは正規化され、検索用に最適化されます。配列内の値がわずかしかない場合でも、そのデータを、配列値と「結合」する必要がある他の取得データと組み合わせる必要がある場合があります。その場合、SQLはインデックス、外部キーなどを使用して最適化されます(正規化)。

つまり、値を変更する必要がない場合は、コードに10個の値を常にハードコーディングして、DBへのラウンドトリップを保存できます。それはあなたのアプリケーションがどのように機能するか、そしてこの配列が何のために使われるかによります。

1

最善のものが個別の正規化テーブルであることについて、他のすべての意見に同意します。ただし、すべてを同じテーブルに置くように主張する場合は、配列を1つの列だけに配置しないでください。代わりに、10個の列を作成し、各配列値を別の列に格納します。それはあなたの解析と更新の問題を保存します。

0
Clodoaldo Neto