SQL和elasticsearch之间的良好实践

时间:2016-12-22 10:02:23

标签: sql database search elasticsearch nosql

想象一下,你有一个像mysql或postgresql这样的SQL数据库。你有两个表:用户和汽车。一个用户可以驾驶N辆车,一辆车可以由N个用户驾驶,因此您有第三个驾驶"表有两个外键。

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

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

1)放弃sql数据库。您的所有表格现在都在弹性搜索中。您可以搜索任何您想要的内容,但必须手动处理所有约束。

2)将结构保留在sql数据库中,保留三个表,主键和外键。但是,您的表仅包含elasticsearch中关联行的弹性搜索ID。例如,在表用户中,你保留user_id并添加一个user_elasticsearch_id,指向你找到名称,电子邮件等的弹性搜索行...所以你有你的sql约束,你可以做搜索,但你必须维护两张桌子。

3)重复。你没有触摸你的sql数据库,你复制了elasticsearch数据库上的所有行。你有你的约束,你可以搜索,但你必须再次维护两个表,你有两倍的数据和两倍的存储空间。

现在,stackoverflow的勇敢者,在这种情况下你会做什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

请记住,您可以强制使用ID en ES。它可能是" user_PK"或类似的东西。

答案 1 :(得分:1)

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

对于非关键业务数据(如日志等)的替代方案是将Elasticsearch独立使用。

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