在mysql数据库中高效存储用户数据
我正在开发一个推荐引擎,因此需要存储大量数据并跟踪用户的每一个动作。所以,基本上我的网站是一个产品搜索引擎,将有一组查询作为用户数据。以下是数据集的一些示例 范例在mysql数据库中高效存储用户数据,mysql,database,database-design,relational-database,database-management,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对应,该ID将采用这种形式(字符串用~分
User1 :
1. Apple Ipod tOuch
2. Samsung Galaxy Ace Plus
3. HArry Porter
User2 :
1. Product1
2. Product2
等等
一种方法(天真的)可能是让一个ID与我的每个用户关联,然后让一个字符串与该ID对应,该ID将采用这种形式(字符串用~
分隔):-
但考虑到我以后将如何处理这些数据,这种方法将不会有效
有谁能想出一个非常有效的模型,在mysql中很容易实现吗
如果我不清楚我的疑问,请发表评论。经典设计是供用户使用的表格:
Users(user_id,user_name,reg_date....)
产品表:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
具有映射用户-->产品的表:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
例如:
用户:
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
用户和产品:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
经典的设计是一张供用户使用的桌子:
Users(user_id,user_name,reg_date....)
产品表:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
具有映射用户-->产品的表:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
例如:
用户:
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
用户和产品:
Products(prod_id,prod_name,prod_cost....)
User_products(user_id,prod_id ....)
user_id | prod_id
1200 |12900
1200 |45673
1200 |99876
7856 |34590
7856 |56283
避免用标识符分隔字符串,因为您必须处理提交的数据,否则当您获得大量数据时,您的搜索引擎将非常慢。
我认为Grisha是绝对正确的-用户或产品搜索(数字id搜索),结合映射表将比通过文本/varchar字段、分隔结果等进行搜索更快地输出结果。避免使用某些标识符分隔字符串,因为您必须处理提交的数据,否则,当你获得大量数据时,你的搜索引擎会非常慢。
我认为Grisha是绝对正确的-用户或产品搜索(数字id搜索),结合映射表,将比通过文本/varchar字段、分离结果等进行搜索更快地输出结果。使用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表中有另一个字段,如purchase date,您还可以通过对查询的简单扩展,找出这些用户何时购买了产品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表中还有另一个字段,如purchase date,您还可以通过对查询的简单扩展,找出这些用户何时购买了产品1,或者找到在给定时间段内购买了产品的所有用户。您读过关于关系数据库和规范化的内容吗?@RemusRusanu还没有,但是告诉我,我会经历的。谢谢:)你的方法打破了第一个范式。小心这里躺着龙。如果您真的需要这样存储数据,那么NoSQL替代方案可能更适合您的需要。就像Remus提到的,请检查关系数据库的规范化形式以及它们存在的原因。从开始。按照维基百科文章末尾列出的链接进行操作。你读过关于关系数据库和规范化的任何内容吗?@RemusRusanu还没有,但是告诉我,我会看一遍。谢谢:)你的方法打破了第一个范式。小心这里躺着龙。如果您真的需要这样存储数据,那么NoSQL替代方案可能更适合您的需要。就像上面提到的Remus一样,请检查关系数据库的规范化形式以及它们存在的原因。从开始。按照维基百科文章末尾列出的链接进行操作。@Prashantsigh:我不知道你来自哪里,但上面的解决方案肯定是规范化方法。如果用户数量是无限的,那么Naiver方法也会有同样多的问题,并且在试图回答“谁拥有产品1”的问题时,通过逗号分隔(或tilda分隔)字符串进行搜索既慢又无用。我错把你的评论标为有用;“这既有侮辱性又没有用处。@Prashant Singh-数据库通常处理无穷多组数据,所以您的案例并不特殊。为了声明哪种方法更好,您必须定义您想要支持的查询类型。@No'amNewman我想知道的是(比如,谁会对注释lol进行投票),您可以通过单击“向上投票”取消注释向上投票again@Esailija:单击向上箭头没有任何作用(至少对我没有)。也许其他人可以记下这条评论?@No'amNewman啊,好吧,这项功能一定被删除了,或者我误解了。。。不,任何人都不能否决评论:(@prashantsigh:我不知道你来自哪里,但上面的解决方案肯定是标准方法。如果用户数量是无限的,并且通过逗号分隔(或tilda分隔)进行搜索,那么朴素的方法也会有同样多的问题当试图回答“谁拥有产品1”的问题时,字符串速度慢且无用。我错误地将您的评论标记为有用;它既是侮辱性的,也是无用的。@Prashant Singh-数据库通常处理无限多组数据,因此您的情况并不特殊。为了声称哪种方法更好,您必须定义哪种查询类型你想支持的。@No'amNewman我想知道(比如,谁会投票给那个评论lol),你可以通过点击投票取消投票again@Esailija:单击向上箭头没有任何作用(至少对我来说不是).也许其他人可以删除该评论?@No'amNewman啊,那么好吧,该功能一定被删除了,或者我误解了……而且,不,任何人都不能删除评论:(它看起来不必那么复杂