2

過去の行動のさまざまな側面を要約した多数の記述属性とともに、一連の顧客で構成されるデータセットにデータ マイニング アルゴリズムのグループを適用しています。10,000 を超える属性があり、それぞれが顧客 ID を主キーとするテーブルの列として格納されています。いくつかの理由から、これらの属性をその場で計算するのではなく、事前に計算する必要があります。私は通常、指定された属性セットを持つ顧客を選択しようとします。アルゴリズムは、任意の数のこれらの属性を 1 つの SELECT ステートメントで組み合わせて、必要なテーブルを結合できます。すべてのテーブルの行数は同じです (顧客ごとに 1 つ)。

これらの属性のテーブルを構成する最良の方法は何だろうと思っています。属性を 20 ~ 30 列のテーブルにグループ化して、平均してより多くの結合を必要とするが SELECT ごとの列数を少なくするか、結合の数を最小限に抑えるために最大列数のテーブルを用意するが、10K 列すべてを結合する可能性がある一度?

また、巨大な 3 列の customerID-attribute-value テーブルを 1 つ使用して、そこにすべての情報を格納することも考えましたが、「必要なこれらの属性タイプのクエリですべての顧客を選択する」ように構成するのは難しいでしょう。

私は MySQL 5.0 以降を使用していますが、これは一般的な SQL っぽい質問だと思います。

4

3 に答える 3

5

私の経験から、10,000列のテーブルを使用することは非常に悪い考えです。将来、この数が増えるとどうなりますか?

多数の属性がある場合は、水平方向にスケーリングされたテーブル (列数が多い) を使用しないでください。新しいテーブル属性を作成し、alltributes 値をそこに配置する必要があります。次に、このテーブルを多対 1 の関係でメイン エントリ テーブルに接続します。

2 番目の方法は、SQL を使用しない (MongoDB などの) システムを使用することです。

于 2012-06-17T23:03:03.107 に答える
2

@odiszapc が言ったように、たとえば次のようなメタモデル構造を使用する必要があります。

CREATE TABLE customer(ID INT NOT NULL PRIMARY KEY, NAME VARCHAR(64));
CREATE TABLE customer_attribute(ID INT NOT NULL, ID_CUSTOMER INT NOT NULL, NAME VARCHAR(64), VALUE VARCHAR(1024));

指定された顧客の基本情報を返します。

SELECT * FROM customers WHERE name='John';

特定の属性に一致する顧客を返します。

SELECT c.* 
FROM customer c 
    INNER JOIN attribute a1 ON a1.id_customer = c.id 
                           AND a1.name = 'address' 
                           AND a1.value = '1078, c/ los gatos madrileños'
    INNER JOIN attribute a2 ON a2.id_customer = c.id 
                           AND a2.name = 'age' 
                           AND a2.value = '27'

ジェネレーターは、その場で内部結合を生成する必要があります。

テーブルの適切なインデックスにより、このすべてのエンジンが比較的高速に動作するようになります (顧客ごとに 10,000 個の属性と 10,000 個の顧客を想定すると、実際にはかなりの課題になります...)

于 2012-06-18T00:49:20.043 に答える
1

10,000 列は多すぎます。を使用しない場合、SELECT ステートメントは非常に長くて面倒になります*。属性を最も有用で意味のあるものに絞り込み、他の属性を排除できると思います

于 2012-06-17T23:31:17.243 に答える