在数据库的多列中搜索 user/client 输入信息的最佳方法是什么?
What is the best way to search multiple columns of a database for user/client inputted information?
我有以下格式的数据:
+---------+---------+----------+-----------+-----------+-----------+
| id | title | author | keyword_1 | keyword_2 | keyword_3 |
+---------+---------+----------+-----------+-----------+-----------+
我希望将其存储在数据库中,以便我可以通过 title
、keyword_1
、keyword_2
或 keyword_3
.
进行搜索
一个例子是
+---------+------------------+-----------+-------------+-------------+-----------+
| id | title | author | keyword_1 | keyword_2 | keyword_3 |
+---------+------------------+-----------+-------------+-------------+-----------+
| 123 | Learn Java 101 | John Doe | java | programming | software |
+---------+------------------+-----------+-------------+-------------+-----------+
在前端,有一个表单,用户可以在其中输入标题 and/or 关键字。需要查询数据库以获取此信息。但用户输入可能不会完全匹配,因此我们需要进行某种正则表达式或模糊匹配。用户有效负载可能会输入如下内容:
{
title: "Learn Java",
author: "Jon Doee",
keyword1: "computers",
keyword2: "softwar",
keyword3: null,
}
我知道有一些 built-in 操作,例如,在 Postgres 中我们有 LIKE
和 Levenshtein()
。但是,我不确定这是否是正确的方法。将关键字与所有三列进行比较似乎是一项非常昂贵的操作。
当然必须有一个干净的方法来做到这一点。我在这里发帖是因为我想检查这是否是我应该走的路。
从架构的角度来看,这是存储数据的正确方法吗?我考虑过使用 document-based 系统,但我不确定那会更好还是更糟。
我对这一切有些陌生,希望得到一些关于推荐内容的指导。
谢谢!
当您使用 RDBMS 并且清楚地知道要存储哪些信息时,为什么更喜欢存储在文档中。
在 RDBMS 中,当信息不是相关的或目的只是存储和检索并且修改最少时,通常使用 json、xml 等数据类型。
查看您的 table,在处理大量数据时,与文档方法相比,关系方法总能为您提供更快的结果。
是的,like 操作有点昂贵,替代方法是 REGEXP 或 SIMILAR TO(对于 Postgres)。你应该知道在哪里使用什么。您始终可以在要在 where 子句中使用的列上创建模式匹配索引。 GIN/GIST 存储超过 2 个单词的列的索引。 ex:Title
如果正在执行连续更新或删除,请考虑通过设置正确的 vacuum 参数对 table 执行维护操作,分析 table,索引 rebuild/recreate。
如果存储了数百万条记录,请使用table分区。
你的要求很不错,我看这里没有存储文档的必要。
我将从规范化关系模型开始:
书籍:
| id | title | author |
| 123 | Learn Java 101 | John Doe |
然后:
图书关键词
| book_id | Keyword |
| 123 | java |
| 123 | programming |
| 123 | software |
此数据模型的一个特别有价值的功能是您可以有一个 Keywords
table 并验证只有有效的关键字进入此 table.
这是为每个实体存储多个值的“正常”方式。
掌握了这个之后,就可以考虑替代结构了。例如:
- 将关键字存储为文本字段并使用文本搜索可以很好地工作在某些情况下。
- 将关键字存储为数组可以很好地工作在某些情况下。
- 将关键字存储在 JSON 中可以很好地工作 在某些情况下。
但从 SQL 语言旨在支持的内容开始——table 中的独立实体。
我有以下格式的数据:
+---------+---------+----------+-----------+-----------+-----------+
| id | title | author | keyword_1 | keyword_2 | keyword_3 |
+---------+---------+----------+-----------+-----------+-----------+
我希望将其存储在数据库中,以便我可以通过 title
、keyword_1
、keyword_2
或 keyword_3
.
进行搜索
一个例子是
+---------+------------------+-----------+-------------+-------------+-----------+
| id | title | author | keyword_1 | keyword_2 | keyword_3 |
+---------+------------------+-----------+-------------+-------------+-----------+
| 123 | Learn Java 101 | John Doe | java | programming | software |
+---------+------------------+-----------+-------------+-------------+-----------+
在前端,有一个表单,用户可以在其中输入标题 and/or 关键字。需要查询数据库以获取此信息。但用户输入可能不会完全匹配,因此我们需要进行某种正则表达式或模糊匹配。用户有效负载可能会输入如下内容:
{
title: "Learn Java",
author: "Jon Doee",
keyword1: "computers",
keyword2: "softwar",
keyword3: null,
}
我知道有一些 built-in 操作,例如,在 Postgres 中我们有 LIKE
和 Levenshtein()
。但是,我不确定这是否是正确的方法。将关键字与所有三列进行比较似乎是一项非常昂贵的操作。
当然必须有一个干净的方法来做到这一点。我在这里发帖是因为我想检查这是否是我应该走的路。
从架构的角度来看,这是存储数据的正确方法吗?我考虑过使用 document-based 系统,但我不确定那会更好还是更糟。
我对这一切有些陌生,希望得到一些关于推荐内容的指导。 谢谢!
当您使用 RDBMS 并且清楚地知道要存储哪些信息时,为什么更喜欢存储在文档中。 在 RDBMS 中,当信息不是相关的或目的只是存储和检索并且修改最少时,通常使用 json、xml 等数据类型。 查看您的 table,在处理大量数据时,与文档方法相比,关系方法总能为您提供更快的结果。
是的,like 操作有点昂贵,替代方法是 REGEXP 或 SIMILAR TO(对于 Postgres)。你应该知道在哪里使用什么。您始终可以在要在 where 子句中使用的列上创建模式匹配索引。 GIN/GIST 存储超过 2 个单词的列的索引。 ex:Title
如果正在执行连续更新或删除,请考虑通过设置正确的 vacuum 参数对 table 执行维护操作,分析 table,索引 rebuild/recreate。
如果存储了数百万条记录,请使用table分区。
你的要求很不错,我看这里没有存储文档的必要。
我将从规范化关系模型开始:
书籍:
| id | title | author |
| 123 | Learn Java 101 | John Doe |
然后:
图书关键词
| book_id | Keyword |
| 123 | java |
| 123 | programming |
| 123 | software |
此数据模型的一个特别有价值的功能是您可以有一个 Keywords
table 并验证只有有效的关键字进入此 table.
这是为每个实体存储多个值的“正常”方式。
掌握了这个之后,就可以考虑替代结构了。例如:
- 将关键字存储为文本字段并使用文本搜索可以很好地工作在某些情况下。
- 将关键字存储为数组可以很好地工作在某些情况下。
- 将关键字存储在 JSON 中可以很好地工作 在某些情况下。
但从 SQL 语言旨在支持的内容开始——table 中的独立实体。