mysql - 非规范化与子/父和嵌套

标签 mysql elasticsearch filtering normalization nosql

我们正在为事件、事件的时间表和事件发生的地点设计 Elastic Search 模型。 设计如下:

model 我们可能需要的查询示例:

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"
    }
  ],
  ...
}

优点:

  1. 应该坚持“key:value”方法的更扁平的模型
  2. 实体自己携带所有信息

缺点:

  1. 大量冗余数据
  2. 更复杂的实体

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"
}

优点:

  1. 避免重复冗余数据

缺点:

  1. 更多连接(甚至父/子存储在相同的 shard )
  2. 模型不是那么平坦,我不确定性能

到目前为止,我们有一个关系数据库,其中的模型运行良好,但速度不够快。特别是当你想象一家电影院时,一个事件(电影)可以在不同的地方有数千个时间表,我们希望实现非常快速的过滤响应,正如我在第一部分中所写的那样。

我期待任何有助于正确设计数据模型的建议。我也会很高兴回顾我的假设(可能其中一些可能是错误的)。

最佳答案

很难对数据进行反规范化。例如,某项事件的表演者人数未知;因此,如果您要为表演者设置特定字段,则需要 perofrmer1.firstname、perofrmer1.lastname、performer2.firstname、performer2.lastname 等。但是,如果您改用嵌套字段,则只需在事件下定义一个嵌套字段 Performer具有正确子字段映射的索引,然后您可以添加任意数量的子字段。这将使您能够按表演者或表演者按事件查找事件。这同样适用于其余指数。

就父子文档与嵌套文档而言,父子文档提供了更多的依赖性,因为子文档驻留在完全独立的索引上。父子字段和嵌套字段都可以指定“include_in_parent”选项自动为您反规范化字段

关于mysql - 非规范化与子/父和嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174436/

相关文章:

elasticsearch - 如何使用 Logstash 从 S3 解析数据并推送到 Elastic Search,然后推送到 Kibana

metadata - elasticsearch中的主节点网关和其他节点网关有什么区别?它们都存储元数据,不是吗?

asp.net - 如何防止索引字段?

Angular:具有使用 mat-select-filter 并向过滤器字段添加图标的搜索功能的多个 mat-select 下拉列表

php - 如何将android中的后置参数声明为php

mysql - 网络消息系统的数据库结构

MySql 通过 ODBC 到 SPSS - 无法检索字符串

python - 如何有效地过滤具有任意长度元组作为键的字典?

javascript - 保持选中本地存储的复选框,同时在加载时过滤列表

mysql - 如何在 R 中转义撇号以便将字符串插入 MySQL 表中