Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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
Php SQL数据库中的长字符串替代方案?_Php_Sql_Database - Fatal编程技术网

Php SQL数据库中的长字符串替代方案?

Php SQL数据库中的长字符串替代方案?,php,sql,database,Php,Sql,Database,我们正在创建一个网站,用户可以创建一个特定的个人资料。目前,我们已经有大约662000个配置文件(数据库中的记录)。用户可以将某些关键字(分为5类)链接到其个人资料。每个类别最多可以链接1250个关键词(不,这不是胡说八道,对于某些个人资料来说,这是有意义的)。此时,我们将这些关键字保存到一个数组中,并将序列化数组插入数据库中概要文件的记录中 当其他用户使用搜索功能并搜索其中一个关键字时,将使用“WHERE keyword LIKE%keyword%”执行SQL查询。这意味着is必须访问大量的记

我们正在创建一个网站,用户可以创建一个特定的个人资料。目前,我们已经有大约662000个配置文件(数据库中的记录)。用户可以将某些关键字(分为5类)链接到其个人资料。每个类别最多可以链接1250个关键词(不,这不是胡说八道,对于某些个人资料来说,这是有意义的)。此时,我们将这些关键字保存到一个数组中,并将序列化数组插入数据库中概要文件的记录中

当其他用户使用搜索功能并搜索其中一个关键字时,将使用“WHERE keyword LIKE%keyword%”执行SQL查询。这意味着is必须访问大量的记录,并遍历每个记录的整个序列化数组。向关键字列添加索引相当棘手,因为它们没有定义的最大长度(这可能是22000个以上字符!)

还有其他更明智、更实际的方法吗

谢谢

决不,决不,决不在一列中存储多个值! 使用映射表

user_keywords TABLE
--------------------
user_id       INT
keyword_id    INT


users         TABLE
---------------------
id            INT
name          VARCHAR
...


keywords      TABLE
---------------------
id            INT
name          VARCHAR
...
然后,您可以像下面这样返回在其配置文件中具有特定关键字的所有用户

select u.* 
from users u
inner join user_keywords uk on uk.user_id = u.id
inner join keywords k on uk.keyword_id = k.id 
where k.name = 'keyword_name'
决不,决不,决不在一列中存储多个值! 使用映射表

user_keywords TABLE
--------------------
user_id       INT
keyword_id    INT


users         TABLE
---------------------
id            INT
name          VARCHAR
...


keywords      TABLE
---------------------
id            INT
name          VARCHAR
...
然后,您可以像下面这样返回在其配置文件中具有特定关键字的所有用户

select u.* 
from users u
inner join user_keywords uk on uk.user_id = u.id
inner join keywords k on uk.keyword_id = k.id 
where k.name = 'keyword_name'

由于您正在处理大量数据,因此应该使用NoSQL数据库,如Hadoop/Hbase、Cassandra等。您还应该了解Lucene/Solr


由于您处理的是大量数据,您应该使用NoSQL数据库,如Hadoop/Hbase、Cassandra等。您还应该看看Lucene/Solr


没有。这叫做标准化。将数据划分到多个表中以便于管理的过程。此外,使用
的搜索,如“%term%”
将始终执行完整的表扫描,因为无法使用索引。有多种方法可以解决这个问题,第一种是规范化数据。当你可以简单地将多个值存储在多行中时(这就是数据库存在的原因)。我同意@N.B.而且这是一个糟糕的数据库设计,IMO,所以如果可能,最好尝试修复它。我只是想问,当用户创建配置文件时,我们是否生成了用户名或PK?在搜索过程中,这不是很有用吗?@Pooh:是的,其他变量确保至少不需要搜索所有662000条记录,但优化关键字列对于提高性能和减少服务器负载至关重要。确实如此。这叫做标准化。将数据划分到多个表中以便于管理的过程。此外,使用
的搜索,如“%term%”
将始终执行完整的表扫描,因为无法使用索引。有多种方法可以解决这个问题,第一种是规范化数据。当你可以简单地将多个值存储在多行中时(这就是数据库存在的原因)。我同意@N.B.而且这是一个糟糕的数据库设计,IMO,所以如果可能,最好尝试修复它。我只是想问,当用户创建配置文件时,我们是否生成了用户名或PK?搜索过程中这不是很有用吗?@Pooh:是的,其他变量确保至少不需要搜索所有662000条记录,但优化关键字列对于提高性能和减少服务器负载至关重要。这意味着我必须创建一个包含1250多列的关键字表。这真的是更好的选择吗?不。创建一个包含两列的关键字表:
id
name
。这个表有1250行。所以我会有一个表“users”,其中包含配置文件信息和唯一的ID(他们已经有了)。表user\u keywords对于每个用户最多有1250行,每行都表示user\u id-some keyword\u id。这是否正确?这意味着查询只需检查用户_关键字中关键字与搜索匹配的所有行(因为我现在可以实际应用索引)。对吗?那么这似乎是一个很好的选择,谢谢你的帮助juergen!这意味着我必须创建一个超过1250列的关键字表。这真的是更好的选择吗?不。创建一个包含两列的关键字表:
id
name
。这个表有1250行。所以我会有一个表“users”,其中包含配置文件信息和唯一的ID(他们已经有了)。表user\u keywords对于每个用户最多有1250行,每行都表示user\u id-some keyword\u id。这是否正确?这意味着查询只需检查用户_关键字中关键字与搜索匹配的所有行(因为我现在可以实际应用索引)。对吗?那么这似乎是一个很好的选择,谢谢你的帮助juergen!