Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql数据库中高效存储用户数据_Mysql_Database_Database Design_Relational Database_Database Management - Fatal编程技术网

在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啊,那么好吧,该功能一定被删除了,或者我误解了……而且,不,任何人都不能删除评论:(它看起来不必那么复杂