-2

彼がニュースレターを受け取りたいかどうかなど、顧客の好みに関する情報を保持する顧客テーブルがあります。ニュースレターの受信を希望する場合、値は「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
4

2 に答える 2

1

2 番目のソリューションは、Entity-Attribute-Valueデータ モデルとして一般に知られているものの変形です。このアプローチは柔軟に見えます。ただし、基本的にスキーマ内にスキーマを生成し、属性の数が増えるとクエリが非常に遅くなります

同一の値を多数格納している場合は、列ストア インデックスを参照してください。選択性が低いシナリオ (多数の行と少数の個別の値のみ) でうまく機能します。

于 2013-09-24T10:42:21.810 に答える