1

我正在开发一个推荐引擎,因此需要存储大量数据并跟踪用户的一举一动。所以,基本上我的网站是一个产品搜索引擎,将有一组查询作为用户数据。以下是数据集的一些示例

例子

User1 :
1. Apple Ipod tOuch
2. Samsung Galaxy Ace Plus
3. HArry Porter 

User2 :
1. Product1
2. Product2

等等。

一种方法(天真)可能是有一个与我的每个用户相关联的 ID,然后有一个与该 ID 对应的字符串,该字符串将采用这种形式(字符串用 分隔~):-

Unique ID - Apple IPod TOuch~Samsung Galaxy Ace Plus~HArry Porter 

但是考虑到我以后将如何处理这些数据,这种方法效率不高。

任何人都可以想出一个在 mysql 中相当容易实现的非常有效的模型吗?

如果我在提出疑问时不清楚,请发表评论。

4

3 回答 3

5

经典设计是一张供用户使用的桌子:

Users(user_id,user_name,reg_date....)

产品表:

Products(prod_id,prod_name,prod_cost....)

带有映射用户->产品的表:

User_products(user_id,prod_id ....)

例子 :

用户:

user_id|user_name
1200   | User1 
7856   | User2

产品 :

prod_id | prod_name
12900   | Apple Ipod tOuch
45673   | Samsung Galaxy Ace Plus
99876   | HArry Porter 
34590   | Product1
56283   | Product2

用户产品:

user_id | prod_id
1200    |12900
1200    |45673
1200    |99876
7856    |34590
7856    |56283
于 2012-10-24T06:12:47.207 回答
1

避免使用某些标识符分隔的字符串,因为您必须处理提交的数据,否则当您获得大量数据时,您的搜索引擎会非常慢。我认为 Grisha 是绝对正确的 - 用户或产品搜索(数字 id 搜索),加入映射表将比通过 text/varchar 字段搜索、分离结果等更快地输出结果。

于 2012-10-24T06:34:07.130 回答
1

使用 Grisha 提出的规范方法,查询“谁拥有产品 1”将被表示为

select user.user_name
from users inner join user_products on users.user_id = user_products.user_id
inner join products on products.prod_id = user.products.prod_id
where products.prod_name = 'Product 1'

这可能看起来很复杂,但实际上非常简单且非常强大。如果 user_products 表中还有购买日期等字段,还可以通过查询的简单扩展,找出这些用户购买产品 1 的时间,或者查找给定时间段内购买该产品的所有用户。

于 2012-10-24T06:42:25.507 回答