3

表形式の情報を表示し、ユーザーがそれを入力および編集できるようにするアプリケーションがあります。このためのデータベース設計に取り組んでおり、次の問題に遭遇しました。

アプリケーション内のテーブルごとに MSSQL テーブルを作成することは避けたいので、すべてのテーブルをまとめて 2 つのテーブルで表そうとしています。

主キーと列MyAppTableを持つテーブルを定義しました。Id INTEGERName CHARACTER VARYING(255)

そこからMyAppColumn、列に対する外部キーを持つテーブルを定義し、レンダリングされたテーブル内の位置を示す列MyAppTable.Idも持っています。Position INTEGER

MyAppRow最後に、列に対して外部キーがあり、MyAppColumn.Id列を持つテーブルを定義しましたData BINARY(32)。これは小さなファイルのテーブルなので、このデータ型が適しています。

MyAppColumn.Position実際の問題は、列がそれぞれに対して一意であることを保証できないことMyAppTableです。

通常の状況の例:

  • MyAppTableId0で
  • MyAppColumnId0、0、0TableIdで_ Position_
  • MyAppColumn1、0、1 Id_ TableId_ Position_
  • MyAppRowColumnId0で、[Data何か]
  • MyAppRowColumnId1、Data[何か]で
  • MyAppTableId1で
  • MyAppColumn2、1、0 _ Id_ TableId_Position
  • MyAppRowColumnId2、Data[何か]で

データベースで不可能にしたい状況の例:

  • MyAppTableId0で
  • MyAppColumnId0、0、0TableIdで_ Position_
  • MyAppColumnId1、0、0 _ TableId_ Position_

ご覧のとおり、列のペアを制約する何らかの方法が必要です。2 つの列TableIdPositionはそうである必要がありますUNIQUEが、それが個別に行われた場合、2 つのテーブルが両方ともPosition0 の列を持つことができないことを意味します。

Microsoft SQL Server 2012 でこれを達成するにはどうすればよいですか?

4

1 に答える 1

6

あなたの問題の解決策は、メタデータをテーブルにエンコードするのではなく、実際のテーブルを作成することです。

すぐにあなたの後ろを噛むいくつかのもの:

  • 関係をモデル化できません
  • インデックスする方法はありません
  • 入力検証なし (それは日付か、整数か、画像か?)
  • 実際の正確な統計を取得する方法がない
  • 作成するすべてのクエリが悪夢になる

将来的に多くの時間と労力を節約し、設計段階で実際のテーブルを作成してください。 このタイプのメタデータ「ゴッド テーブル」は繰り返し試行されましたが、機能しませんでした。

そうは言っても、非常に限られたデータセットを表している場合(あなたが言うように、ファイルのみ)、座標系を検討します。

そのままにしておいてくださいMyAppTable

MyAppFileフィールドを持つテーブルを作成します。

  • FileId (int ID)
  • MyAppTableId(FK)
  • Data(変数)
  • XPos(整数)
  • YPos(整数)

に一意の制約があり(MyAppTableId, Xpos, Ypos)ます。

これにより、保存しようとしているものがより正確に表現され、保守が容易になり、整合性を確保できます。

于 2012-11-07T21:34:38.927 に答える