23

クライアントのプロジェクトに取り組んでおり、データベースの初期設計を行っています。このプロジェクトは、マトリックス ダイアグラム内でプロセスとその結果を追跡するための単純な Web アプリになります。これらをリレーショナル テーブルに格納する良い方法を探しています。

現在、x 座標と y 座標もマップされるルーチンの一般的なテーブルがあると考えています。おそらく、「ヒット」が記録された座標の ID を含むルックアップ テーブルから外れる可能性があります。これを行うためのより良い方法はありますか?

ありがとう!

編集:

これはプロジェクトの始まりにすぎないので、まだ詳細は限定されていますが、複数のテーブルの背後にある主な理由は、マトリックスのサイズが完全に動的で汎用的であるため、それぞれが異なる可能性があり、それらがユーザー

また、x/y 値の順序が重要であることを忘れていました。これは、xy と値の複数のテーブルを持つことの背後にある私の推論をさらにサポートしました。このことから、個々のセルを知る必要があることが重要であると強く思います。

例:

この基本的な例 (抽象的ではありますが) は、レストランに関するプロセスにあります。アクションは、座る、食べ物を注文する、メニューを調べる、飲み物を注文する、食べる、支払うなどの行に沿ったものです。結果は、注文が取られ、飲み物が配達され、食べ物が配達され、与えられます。一見単純そうに見えても、テイクアウトやバイキングの場合も含めて考えると複雑になります。行動と結果の順序は、状況間の違いを理解する上で不可欠になります

4

4 に答える 4

26

これを行うには多くの方法があります。お客様に最適な方法をより具体的に判断するには、さらに多くの情報が必要です。ただし、SOP の方法は 2 つあります。

マトリックスごとに個別の表のいずれか:

CREATE TABLE YourMatrixName(
    RowNo smallint NOT NULL,
    ColNo smallint NOT NULL,
    CellValue varchar](50) NULL,
 CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED 
    ([RowNo] ASC, [ColNo] ASC)
) ON [PRIMARY];
GO

CREATE UNIQUE NONCLUSTERED INDEX IX_YourMatrixName ON dbo.YourMatrixName
    (ColNo, RowNo); 
GO

または、1 つのテーブル内のすべての行列:

CREATE TABLE Matrices(
    MatrixName varchar(24) NOT NULL,
    RowNo smallint NOT NULL,
    ColNo smallint NOT NULL,
    CellValue varchar(50) NULL,
 CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED 
    ([MatrixName] ASC, [RowNo] ASC, [ColNo] ASC)
) ON [PRIMARY];
GO

CREATE UNIQUE NONCLUSTERED INDEX IX_Matrices ON dbo.Matrices
    (ColNo, RowNo); 
GO

これらは標準的な正規形であり、実質的にそれを行う他のすべての方法は十分に正規化されていません。これらのアプローチの利点:

  1. すべてのセルに入力する必要はありません。使用しているセルだけに入力してください。または、デフォルト値 (0 または "") を設定し、それらをスキップします。
  2. これは最も柔軟なアプローチです。「オールインワン」モデルであっても、同じサイズに制限する必要はまったくなく、サイズ変更も非常に簡単です。
  3. マトリックスの内容を簡単に照会できますが、よりコンパクトなストレージ メソッドではますます困難になります。
  4. 「ヒット」またはマトリックスセルのその他の側面は、行の追加フィールドとして簡単に実装できます。追加のスペースが心配な場合は Null 可能にし、これらの属性を個別にクエリ/レポートする場合はインデックスを作成します。このモデルでも、このような機能を簡単に後付けできます。

主な欠点は、通常、データのオーバーヘッドに対して大きな領域が存在することです。多くの人は、新しいマトリックスを挿入または取得するためのオーバーヘッドも高いと想定していますが、実際には、それを非常に高速にするいくつかの文書化された手法があります。

于 2010-01-26T21:18:46.740 に答える
5

ビデオ メモリ、非常に単純な 2D マトリックスは次のように格納されます。

ABCD
EFGH
IJKL

配列のようにRAMで順次

A,B,C,D,E,F,G,H,I,J,K,L

要素 x,y は配列オフセットで見つけることができます

[y*width+x]

たとえば、x=2,y=2 (ゼロベース) は要素 K を参照します。

[y*width+x]=[2*4+2]=10.配列要素 10 (これもゼロ ベース) = K なので、問題ありません。

コンマ区切りのリストに格納すると、任意のサイズのマトリックスを nvarchar フィールドに入れることができます。これは、SQL で個々のセルをクエリする必要はなく、マトリックス全体を取得してクライアント側で処理するだけであると想定しています。

テーブルは次のようになります。

tbl_matrices
----
id
user_id
matrix nvarchar(max)
于 2010-01-26T21:06:20.670 に答える
4

あなたの行列は疎ですか?まばらな場合は、ほとんどが 0 である完全な 2D テーブルを使用するよりも、各エントリにヒットのリストを格納するだけの方がよい場合があります。

于 2010-01-26T20:57:42.873 に答える
3

2 つのテーブルではなく、1 つのテーブル (x, y, 結果) を使用します。それを超えて、与えられた限られた情報でこれ以上のアドバイスをすることは困難です.

于 2010-01-26T20:58:47.257 に答える