ではなく、テーブルを水平方向に拡張しようとすると、意識的に意識して決定する必要があります。
代わりに、名前と値のペアとして値を格納することをお勧めします。特定の型を持つテーブルを持つことができます(つまり、キーと組み合わされた整数値が必要だったとしましょう)。次に、それらをユーザー用の辞書に選択します。
キー値を複製することに懸念がある場合は、キーを持つテーブルもあります。
たとえば、あなたはおそらく、一意のインデックスを配置したいと思います(文字列値用)UserDefinedString
テーブルを持っているでしょうUserDefinedKey
テーブル次に
UserDefinedKeyId (int, PK) Key (varchar(?))
-------------------------- ----------------
1 'My Website'
2 'My favorite color'
UserDefinedStringId UserId UserDefinedKeyId Value
(int, PK) (int, FK) (int, FK) (varchar(max))
------------------- --------- ---------------- --------------
1 1 1 'http://stackoverflow.com'
2 1 2 'Blue'
3 2 2 'Red'
を持っていると思いますUserId
とUserDefinedKeyId
のフィールドに、同じキーの複数の値を入力しないようにします(必要な場合は、別のテーブルを使用せずにユニークなnstraint)。
ユーザーの値を追加する場合は、UserDefinedKey
テーブルに値を追加し、そのテーブルとその値を保持する他のテーブルからロジックを削除します。
値を垂直に格納するもう1つの利点は、すべてのユーザーが使用していない値の列にスペースを浪費していないことです。
UserId WebSite Color
------ ------- -----
1 http://stackoverflow.com Blue
2 (null) Red
は、今度は、第3のユーザが一緒に来て、Favorite Sports Team
値を追加し、彼ら言わせて:あなたはなるだろう、上記の属性のために、あなたがテーブルを変更するアプローチをとると仮定すると例えば
、それを使用する唯一の1、表は、その後のように見えます:ユーザーの数として
UserId WebSite Color FavoriteSportsTeam
------ ------- ----- ------------------
1 http://stackoverflow.com Blue (null)
2 (null) Red (null)
3 (null) (null) Yankees
と属性成長し、あなたが持っているまばらなデータの量が劇的に増加します。
SQL Server 2008を使用していると仮定すると、sparse columnsを使用できます。そうしないと、テーブルが膨大になりますが、データは多くありません。
また、スパース列を使用しても、その場でスキーマを変更するのにdata definition language (DDL)を使用するのはかなり汚いという事実を払拭しません。
さらに、Entity Frameworkは、新しい属性を考慮してオブジェクトモデルを変更することはできません。属性を追加するたびに、その属性をオブジェクトモデルに追加し、再コンパイルして再デプロイする必要があります。
垂直アプローチでは、より多くの作業が必要ですが、無限に柔軟性があり、データベーススペースをより効率的に活用できます。
あなたは何を正確に達成しようとしていますか?テーブル 'info2'では、EFを使用してデータを取得する方法をどのように計画していますか?基礎となるDBの構造を反映したクラスがあると仮定しています。実行時にDBへの変更を反映するためにそれらを変更する計画はありますか? – itsmatt
何を達成しようとしているのですか: 完全に動的な情報保存サイトを作るために、ユーザーがフィールドや新しいテーブルを追加できるような情報を格納できるシステム – JensB