2011-01-27 5 views
6

私たちは、ユーザーがメモを入力できるようにするプライマリレコードを持っています。各プライマリレコードには18の個別の「メモ」フィールドがあります。SQL Server:varchar(MAX)を使用するか、別のノートテーブルを保持してINNERに参加する方が良いでしょうか?

現在、ID外部キー列と単一のvarchar(8000)列を持つNotesという別のテーブルに正規化してから、必要に応じてINNER JOINするだけです。

私は最近、varchar(MAX)を持つSQL Server 2008に移行しました。別のメモを取り除くとパフォーマンスが向上するかどうかは疑問に思っています代わりにvarchar(MAX)を使用してください。確かに便利だろう。

+0

私の理解では、varchar(MAX)は実際のデータを別のページに保持し、実際のテーブルにその位置へのポインタしか保持しませんでした。言い換えれば、SQL Serverは私たちが手動で行っていたのと同じことを内部的に行っています。それは間違っていますか?すべての回答から、それは確かにそうであるように聞こえるが、私は明確にしたい。それは本当に私が疑問に思う質問です。 – msigman

+0

いいえ。それは 'text'型がどのように働くのかということでした。 'varchar(max)'では、サイズが 'varchar' *の最大サイズ(8000)を超えた場合にのみ真です。最大サイズの中では、これは従来の方法で保存されます。 –

+0

入手しました。ありがとう、私は今私は明らかだと信じています。現在設定されているままにしておきます。 – msigman

答えて

3

私はあなたの設定で完全にはっきりしていません...もしあなたが18個のノート(おそらく異なる "タイプ")を入力できると言うなら、セカンダリノートテーブルを保持するべきです。この場合、はい、varchar(8000)からvarchar(MAX)に切り替えると、ユーザーはメモに8000文字以上を保存できます。

ユーザーがと入力している場合は、個のメモを入力している場合は、その時点でテーブルを正規化したままにしておく必要があります。 varchar(8000)からvarchar(max)に切り替える必要があるかどうかは、8000文字を超えるエンティティをユーザーに許可するかどうかの問題です。その場合、コンテンツは、2005年以前のSQL ServerでTEXTタイプを使用していたかのように、オフラインで格納されることに注意してください。

の大文字のを入力して、それぞれを最大8000文字の複数のチャンクに動的に分割すると言っている場合は、2番目の文字を削除する必要があります親レコードに単一のvarchar(MAX)列を配置します。

これはあなたの質問ですか?

+0

ありがとうございます。ユーザーは実際には18種類の異なるメモを入力しています。私はあなたが言及しているように、実際には別の問題であるので、私は8000について言及してはいけないと思います。テーブルを正規化したままにします。 – msigman

2

より良い設計は、Notesテーブルを保持することです(VARCHAR(MAX)を使用すると、いくつかのスローダウンを引き起こす可能性があります)。

これにより、各ノートをデータベース内の別々のエンティティとして他のものとは独立して扱うことができます。

3

「プライマリ」テーブルにvarchar(max)フィールドがあることは、特にあらかじめ正規化しておけば、悪い考えです。

これはまた、ページの分割、断片化、およびメインテーブルのパフォーマンスの低下につながります。

フィールドがそのテーブルをノートにない場合、誰かが、ノートを追加し、それがデータ・ページを埋める、それがBADで断片化され、別のページ、に分割することがあります。

0

親エンティティへの外部キーとノート番号と単一の[n] varchar(max)列で構成されるプライマリキーを持つ単一のノートテーブルを設定します。これにより、親エンティティごとに複数のメモを持つことができます。

varchar(max)は、従来の単一の列に最大8000オクテットを格納します。サイズがそれを超えると(最大2.1GBまで)、データは[現在廃止されている] text/ntext/imageのようにオーバーフローページに流出します。テキスト/ BLOBデータの扱いは大変面倒でした.SQLは今度はのように扱います。はそのままです。戻ってくるのは文字列だけです。

関連する問題