在mysql数据库中有效地存储用户数据

时间:2012-10-24 06:06:35

标签: mysql database database-design relational-database database-management

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

实施例

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中轻松实现吗?

如果我不清楚地怀疑我的评论。

3 个答案:

答案 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,或查找在给定时间段内购买产品的所有用户。