2009-02-28 12 views
5

私はユーザーの設定用のテーブルを作成しようとしています。 ASP.NETがデフォルトでそれを行う方法は非常に扱いにくいようであり、それを避けたいと思います。現在、ユーザーごとに1つの行を使用しています。ユーザーの好みごとに異なる列があります(正規化されていない、わかっています)。「ユーザー設定」データベーステーブルの設計

私が思いついたもう一つのアイデアは、プレファレンス自体を独自のテーブルに分割してから、ユーザープリファレンステーブルに行PERプレファレンスPERを設定することでした。しかし、これはそれぞれの好みがまったく同じデータ型である必要があることを意味し、私にあまりにも魅力的ではない。

私の質問は次のとおりです。ユーザの好みの値を保持するようにデータベースを設計する最も理想的な方法は何ですか?

答えて

3

データベース作業で避けようとしているアイデアのいくつかは、データの重複と不要な複雑さです。また、 "insert, update, and deletion anomalies"を避けたいそれぞれの行= 1人のユーザーと列、使用可能なさまざまな設定で1つの表にユーザーのプリファレンスを格納することは理にかなっています。

これらの設定が、同じ環境設定を使用する複数のオブジェクト(ユーザーだけでなく)のように、データベース内の他の形式や方法で使用されていることがわかっている場合は、 FK/PKペアの優先順位。

説明したことは、最初のルートが機能しない理由はありません。

2

私は通常これを行う:

Users table (user_id, .... etc.) 
. 
Options table (option_id, data_type, ... etc.) 
(list of things that can be set by user) 
. 
Preferences table (user_id, option_id, setting) 

それは、異なるデータ型にすることとで、オプション定義の一部として、オプションのデータタイプを記録することができますので、私は設定フィールドのための新しいSQLVARIANTデータ型を使用します問い合わせ時に正しいタイプにキャストするためのオプションテーブル。

+0

この場合、data_typeはどのようなものになりますか?これはFKですので、あなたはすべてのデータ型を含む別のテーブルを持っていますか? – NSX

+0

data_typeは、 "decimal(4,2)"のような文字列でも、単にあなたのアプリでEnumerationで定義した数字でもよい...あなたのアプリは結果を共通のデータ型にキャストする方法を決定できる。 –

+0

文字列である必要はありません。有効なデータ型のセットを定義し、型テーブルを作成することができます。これは私のソリューションに似ています。 – BobbyShaftoe

0

実際に素早く、一つの方法:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...) 

Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...) 

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@GregD、ありがとう。 :) – BobbyShaftoe

2

あなたはUserテーブルの単一の行にすべてのユーザー設定を保存する場合は、メンテナンスの悪夢を持っています!

ユーザーごとに環境設定ごとに1行を使用し、環境設定値をvarchar(長さ255、または要件を満たすに十分な大きさの値)として保存します。あなたは明らかにこの列の内外の値を変換する必要があります。

これがうまくいかない状況はですが、大まかなバイナリデータをユーザー設定として保存したいのですが、一般的な要件であるとは思われません。

+0

しかし、ユーザーごとに1つの行につき1つの行を設定すると、EAVタイプのモデルになります。私は常に読んでいますが、すべてのコストをかけて回避する必要があります。 – NSX

関連する問題