根据用户预约关键字的信息分拣投送问题
在设计中遇到一个问题, 可以抽象为如下模型:
某数码产品网站有若干个(设为M个)注册用户,注册用户可从该网站定期收到按其个人喜好定制的某种数码产品(比如手机)的最新信息.个人喜好是指用户在注册时填写的对于产品某种属性的特别偏好,这些属性都有有限个取值,比如手机可分为 品牌:NOKIA,MOTO,SE; 价格:1000元以下,1000元~2000元,2000元~4000元,4000元以上; 支持蓝牙: 是, 否 ... 等等若干种属性. 某个注册用户所填写的个人喜好可以是如上属性的各种可能的逻辑组合,例如:
用户1 :(品牌=NOKIA & 价格=1000元至2000元) | (品牌=MOTO & 价格=1000元以下);
用户2 :(品牌=NOKIA & 价格=1000元至2000元) | (支持蓝牙=是 & 价格=2000元至4000元) | 价格=1000元以下;
用户3 :品牌=SE.
... ...
这里先不用去考虑以什么方式输入,表示,解析和判断这些逻辑关系的问题,假设这已经不是问题了.
那么我们要将获得的每一条最新的数码产品信息送到与其个人偏好相符的用户那里. 每条信息都已经注明了如上各属性的取值(品牌是什么,价位如何,支持蓝牙与否,等).
现在的问题就是应该使用怎样的数据结构和相关算法来进行信息的分拣递送呢? 假如每收到一条信息,就遍历所有注册用户,逐个判断其属性是否与其要求相符,显然效率太低; 另一种做法是,假如有N种属性,那么就建立一个庞大的N维数据表,其中每一项对应着一种可能的属性组合(如Table[0][2][0]对应着2000~4000元的NOKIA支持蓝牙的手机),里面的内容是该属性组合所满足的所有用户的ID号, 每当一个用户注册时,根据其偏好往所有满足其偏好的条目里都添加进其ID,这样虽然注册用户时效率很低,但可以增加分拣时的速度(我只关心分拣投送时的空时复杂度), 然而这又需要浪费大量的存储空间.
我数据结构学得不够好, 还得请教大家,有什么在空间时间上都比较高效的方法能解决我的问题?
[解决办法]
table_属性:作为字典供界面使用
ID 分类 描述
-- ---- -------
1 品牌 Nokia
2 品牌 MOTO
3 MOTO Se
4 价格 1000元以下
5 价格 2000元至4000元
6 价格 4000元以上
...
table_个人喜好:用户定制时更新
用户ID 属性ID
------ ------
...
table_产品属性:新增产品时更新
产品ID 属性ID
------ ------
...
新增某产品 A 后,用下面的 SQL 取得对该产品有兴趣的用户
SELECT t1.用户ID
FROM table_个人喜好 t1
JOIN table_产品属性 t2 ON t2.属性ID = t1.属性ID
WHERE t2.产品ID = A