2

我正在将一组数据挖掘算法应用于由一组客户以及大量描述性属性组成的数据集,这些属性总结了他们过去行为的各个方面。有 10,000 多个属性,每个属性都存储为以客户 ID 作为主键的表中的一列。由于几个原因,有必要预先计算这些属性,而不是动态计算它们。我通常会尝试选择具有指定属性集的客户。这些算法可以将任意数量的这些属性组合在一个 SELECT 语句中,并连接所需的表。所有表的行数都相同(每个客户一个)。

我想知道构造这些属性表的最佳方法是什么。将属性分组到 20-30 列的表中更好吗,平均需要更多的连接,但每个 SELECT 的列更少,或者拥有具有最大列数的表以最小化连接数,但可能所有 10K 列都在一次?

我还想过使用一个巨大的 3 列 customerID-attribute-value 表并将所有信息存储在那里,但是构建一个“选择所有具有我需要的这些属性类型查询的客户”会更加困难。

我使用的是 MySQL 5.0+,但我认为这是一个一般的 SQL 问题。

4

3 回答 3

5

根据我的经验,使用具有 10,000 列的表是非常非常非常糟糕的主意。如果将来这个数字会增加怎么办?

如果有很多属性,则不应使用水平缩放表(具有大量列)。您应该创建一个新的表属性并将所有属性值放入其中。然后将此表以多对一关系连接到主条目表

也许第二种方法是使用无 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'

您的生成器应该即时生成内部连接。

表上的正确索引应该允许所有这些引擎运行得相对较快(如果我们假设每个客户有 10k 个属性和 10k 个客户,这实际上是一个挑战......)

于 2012-06-18T00:49:20.043 回答
1

10,000 列太多了。如果您不使用*. 我认为您可以将属性缩小到最有用和最有意义的属性,消除其他属性

于 2012-06-17T23:31:17.243 回答