我正在开发一个推荐引擎,因此需要存储大量数据并跟踪用户所做的每一个动作。所以,基本上我的网站是一个产品搜索引擎,并将作为用户数据进行查询。以下是数据集的一些示例
实施例
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中轻松实现吗?
如果我不清楚地怀疑我的评论。
答案 0 :(得分:4)
经典设计是一个供用户使用的表格:
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_products:
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
答案 1 :(得分:1)
避免使用某些标识符分隔字符串,因为您必须使用提交的数据,否则当您获得大量数据时,搜索引擎会非常慢。 我认为Grisha是绝对正确的 - 用户或产品搜索(数字ID搜索),与映射表连接将比搜索text / varchar字段,分离结果等更快地输出结果。
答案 2 :(得分: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,或查找在给定时间段内购买产品的所有用户。