SQL和Elasticsearch之间的良好实践



想象您有一个SQL数据库,例如MySQL或PostgreSQL。您有两个桌子:用户和汽车。一个用户可以驾驶N车,可以由N用户驱动汽车,因此您拥有带有两个外键的第三个"驱动器"表。

现在,您希望您的表用户使用Elasticsearch,因为您希望按名称,电子邮件等搜索用户...也许您还需要在汽车表上进行一些搜索。

我看到了三种实现这一目标的方法,我想知道什么是最好的方法:

1)放弃SQL数据库。现在,您的所有桌子都在Elasticsearch上。您可以在任何想要的东西上进行搜索,但必须手动对待所有约束。

2)将结构保留在SQL数据库上,您可以保留三个表,主键和外键。但是您的表仅包含Elasticsearch中关联行的Elasticsearch ID。对于表用户中的典范,您可以保留user_id并添加user_elasticsearch_id指向在eLasticsearch行上指向您找到名称,电子邮件等...这样您就可以使用SQL约束,可以进行搜索,但是您必须维护两个桌子。

3)重复。您不会触摸您的SQL数据库,而是复制Elasticsearch数据库上的所有行。您有限制,可以搜索,但是您必须再次维护两个表,并且有两倍的数据和两倍的存储时间。

现在,勇敢的stackoverflow研究员,在这种情况下,您会怎么做?

谢谢。

关键业务数据最常见的设置是例如SQL数据库作为您的主要数据存储,将Elasticsearch作为其他搜索索引。(=您的解决方案3)。

诸如日志等非业务数据等非业务数据等的替代方案是具有elasticsearch独立的。

解决方案2似乎有线,对我来说不是一个选择。

,因为您可能将数据库中的很多业务规则混合在一起,并使用它使用了应用程序,所以我会保守并保留DB。并使用ES索引我要搜索的用户属性。ES将返回评分的结果。当结果选择时,我将切换到DB来检索所有信息和关系。

所以我会选择2b:将DB保存并存储在ES中,而不是DB中的ID)。

请记住,您可以强制执行ID。它可以是" user_pk"或类似的东西。

最新更新