实施特定数据存储的最佳方法

时间:2019-09-09 11:02:06

标签: java sql orm spring-data-jpa

我必须实施特定的解决方案。

简单地说,它是某种知识库。这是关键字信息(基本上是某种知识库)的存储。

任何数量的关键字可以连接到“信息”,而相同的单词可以连接到不同的信息。示例:

+-------------------------+-------+
|        Key_words        | Data  |
+-------------------------+-------+
| word1 word2 word5       | data1 |
| word3 word2 word4 word6 | data2 |
| word3 word7 word8       | data3 |
+-------------------------+-------+

单词可能会更改,数据也会更改。 我不确定如何“以一种好的方式”进行此操作。

会的

+---------+--------------------+---------------+
|                Storage                       |
+---------+--------------------+---------------+
| id(int) | key_words(varchar) | data(varchar) |
+---------+--------------------+---------------+

这将需要“喜欢”查询来搜索数据或进行某些全文搜索(elasticsearch / lucene /数据库提供了全文搜索),例如

select * from Storage where Key_words like '%word1%' and Key_words like '%word3%'

另一个想法是以多对多关系存储数据:

+---------+---------------+
|         Datum           |
+---------+---------------+
| id(int) | data(varchar) |
+---------+---------------+
| 1       |   data1       |
+---------+---------------+

+---------+------------------+
|         Keywords           |
+---------+------------------+
| id(int) | keyword(varchar) |
+---------+------------------+
| 1       | word1            |
| 2       | word2            |
| ...     | ...              |
| 5       | word5            |
| ...     | ...              |
+---------+------------------+

+---------+-----------------+--------------+
|             KwToData                     |
+---------+-----------------+--------------+
| id(int) | keyword_id(int) | data_id(int) |
| 1       | 1               | 1            |
| 2       | 2               | 1            |
| 3       | 2               | 2            |
| ...     | ...             |              |
| 5       | 5               | 1            |
| ...     | ...             |              |
+---------+-----------------+--------------+

但是在这种情况下,我将不得不通过嵌套搜索来搜索文章(关键字数组+相关数据),并且更新/删除关键字会有些棘手(删除-从kw_to_data中删除记录,更新-搜索关键字(如果存在)-将记录添加到kw_to_data,如果不存在-还将关键字添加到“关键字”表)

有人做了类似的事情吗?如果是的话,从您的经验来看,做到这一点的最佳方法是什么?

0 个答案:

没有答案