彼がニュースレターを受け取りたいかどうかなど、顧客の好みに関する情報を保持する顧客テーブルがあります。ニュースレターの受信を希望する場合、値は「customerNewsletter」列に保存され、true に設定されます。ただし、独自の列にあるこれらのビット値とパラメーターがいくつかあります。顧客ごとに、このように日付、真/偽、整数、および tekst を保存します。
私の顧客の約 80% がニュースレターの受け取りを希望していることがわかったので、80% の値が true に設定されています。ここで、false または true に設定された各顧客の値を保存します。false に設定された 20% を保存するだけでよい場合はどうすればよいですか??
列として含めることができるこれらのパラメーターの約 20 のリストがあります (それらは現在です) が、より良い方法があるかどうか疑問に思っていました。
したがって、これらのパラメーター値を保持する 3 つのテーブルを作成します。実際の値を保持する param テーブル、値の名前を保持する paramsNames テーブル、およびパラメーターを customerID に接続する params テーブルです。
SELECT
customerParamsName as [Name],
customerParamText as [Text],
customerParamINT as [int],
customerParamsDateTime as [Date]
FROM db14.customerParams
INNER JOIN db14.customerParam ON customerParamsChildID = customerParamID
INNER JOIN db14.customerParamsNames ON customerParamNameID = customerParamsNameID
これは私に与えるだろう
Name Text int Date
Phonenumber NULL 615164898 2013-09-20 00:00:00.000
これが良い方法なのか、それともマルチタイプのパラメーターをより効率的に保存するより一般的な方法があるのか 誰にも教えてもらえますか?
もう少し検討した後
2つのテーブルを作成しました
顧客パラメータ
paramID paramNameID ParamParentID paramChildID paramText paramINT paramDate
INT TINYINT INT INT varchar(24) INT DATETIME
PRIMARY INDEXED
customerParamNames
paramNameID paramName
TINYINT VARCHAR(24)
PRIMARY
1 'FirstName'
2 'LastName'
3 'Email Address'
4 'Phonenumber'
5 etc..
firstName と LastName を保存したいとしましょう
両方の値の customerParam にレコードを作成します。
paramID paramNameID ParamParentID paramChildID paramText paramINT paramDate
17456 1 'John'
17467 2 'Doo'
17468 1 752 17456
17469 2 752 17467
'John' という名前の出現回数が増えると予想されるため、それを独立した値として保存し、parentID/ChildID の組み合わせを使用して結合します。
および電話番号の場合
17470 4 752 31615164899
17471 5 752 'me@here.com'
電話番号はこの顧客に対して非常に明示的です。私は親 ID を使用して直接顧客に接続しています。メールアドレスも同様です。
現時点では、このソリューションが進むべき道のように見えます... 私はまだ xml アプローチも検討していますが、データベースに格納されている XQuery と xmlDocuments の使用方法についてよく理解していません。そして、それは多くのオーバーヘッドのようです。
上記の解決策を進めます...誰かがより良い解決策を提供してくれるまで。
SQL の例
DECLARE @paramNames TABLE (paramNameID TINYINT, paramName varchar(24))
DECLARE @param TABLE (paramID INT, paramNameID TINYINT, paramParentID INT, paramChildID INT, paramText varchar(24), paramINT INT, paramDate datetime)
INSERT INTO @paramNames VALUES ( 1, 'firstname')
INSERT INTO @paramNames VALUES ( 2, 'lastname')
INSERT INTO @paramNames VALUES ( 3, 'emailaddress')
INSERT INTO @paramNames VALUES ( 4, 'phonenumber')
select * from @paramNames
INSERT INTO @param VALUES (1, 1, Null, Null, 'John' , Null, Null)
INSERT INTO @param VALUES (2, 2, Null, Null, 'Doo' , Null, Null)
INSERT INTO @param VALUES (3, 1, 752, 1, Null , Null, Null)
INSERT INTO @param VALUES (4, 2, 752, 2, Null , Null, Null)
INSERT INTO @param VALUES (5, 4, 752, Null, Null , 615164899, Null)
INSERT INTO @param VALUES (5, 3, 752, Null, 'me@here.com' , Null, Null)
select
a.paramParentID, b.paramName, c.paramText, c.paramINT, c.paramDate
from @param a
inner join @paramNames b on a.paramNameID = b.paramNameID
inner join @param c on a.paramChildID = c.paramID
UNION ALL
select
a.paramParentID, b.paramName, a.paramText, a.paramINT, a.paramDate
from @param a
inner join @paramNames b on a.paramNameID = b.paramNameID
WHERE paramParentID IS NOT NULL
AND paramChildID IS NULL
結果を与える
paramParentID paramName paramText paramINT paramDate
752 firstname John NULL NULL
752 lastname Doo NULL NULL
752 phonenumber NULL 615164899 NULL
752 emailaddress me@here.com NULL NULL