我们正在为事件、事件的时间表和事件发生的地点设计 Elastic Search 模型。 设计如下:
Find events, which are Concerts, between 1/7/2017 and 7/7/2017
Find artists who performs at London and the event is Theatre play
Find events, which are Movies and having Score > 70%
Find users, who attend event AwesomeEvent
Find venues, which locality is London and any event is planned in the future since today
我读过 elastic doc很少有文章像this和一些堆栈 questions .但我仍然不确定我们的模型,因为它非常具体。
可能的用法示例:
1) 使用嵌套模式
{
"title": "Event",
"body": "This great event is going to be...",
"Schedules": [
{
"name": "Schedule 1",
"start": "7.7.2017",
"end": "8.7.2017"
},
{
"name": "Schedule 2",
"start": "10.7.2017",
"end": "11.7.2017"
}
],
"Performers": [
{
"name": "Performer 1",
"genre": "Rock"
},
{
"name": "Performer 2",
"genre": "Pop"
}
],
...
}
优点:
- 应该坚持“key:value”方法的更扁平的模型
- 实体自己携带所有信息
缺点:
- 大量冗余数据
- 更复杂的实体
2) 以下实体之间的父/子关系(简化)
{
"title": "Event",
"body": "This great event is going to be...",
}
{
"title": "Schedule",
"start": "7.7.2017",
"end": "8.7.2017"
}
{
"name": "Performer",
"genre": "Rock"
}
优点:
- 避免重复冗余数据
缺点:
- 更多连接(甚至父/子存储在相同的 shard )
- 模型不是那么平坦,我不确定性能
到目前为止,我们有一个关系数据库,其中的模型运行良好,但速度不够快。特别是当你想象一家电影院时,一个事件(电影)可以在不同的地方有数千个时间表,我们希望实现非常快速的过滤响应,正如我在第一部分中所写的那样。
我期待任何有助于正确设计数据模型的建议。我也会很高兴回顾我的假设(可能其中一些可能是错误的)。
最佳答案
很难对数据进行反规范化。例如,某项事件的表演者人数未知;因此,如果您要为表演者设置特定字段,则需要 perofrmer1.firstname、perofrmer1.lastname、performer2.firstname、performer2.lastname 等。但是,如果您改用嵌套字段,则只需在事件下定义一个嵌套字段 Performer具有正确子字段映射的索引,然后您可以添加任意数量的子字段。这将使您能够按表演者或表演者按事件查找事件。这同样适用于其余指数。
就父子文档与嵌套文档而言,父子文档提供了更多的依赖性,因为子文档驻留在完全独立的索引上。父子字段和嵌套字段都可以指定“include_in_parent”选项自动为您反规范化字段
关于mysql - 非规范化与子/父和嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174436/