如何最好地将 SQL 模式非规范化为 noSQL (Elasticsearch) 映射

问题描述 投票:0回答:1

我正在使用 Elasticsearch 来存储实验数据,我想要一些关于如何最好地构建我的数据模型的建议。

我可以很容易地用 SQL 表、链接和联接来想象它;但我很难找到将 SQL 模式非规范化为良好 Elasticsearch 映射的好方法。

这是一个简化的示例。假设我有三个 SQL 表:

Experiment Table:
- experiment_ID (PK)
- experiement_name
- start_date
- lead_scientist

Plant Table:
- plant_id (PK)
- species

Follow Up Table:
- follow_up_id (PK)
- experiment_id (FK)
- plant_id (FK)
- date
- biomass
- temperature

这个想法是使用跟进表来跟踪实验的日常观察

ES 的非规范化文档可以是:

{
  "follow_up_id": "f1",
  "date": "2023-10-11T04:06:07",
  "bioMass": 4.6,
  "temperature": 23.6,
  "experiment": {
    "experiment_id": "e1",
    "experiment_name": "...",
    "start_date": "2023-10-01T00:00:00",
    "lead_scientist": "John Doe"
  },
  "plant": {
    "plant_id": "...",
    "species": "..."
  }
}

这对于大多数用例都适用(列出实验、实验的平均数据、列出实验的所有后续措施),但某些用例存在一些问题:

  1. 创建一个新实验:
    当科学家想要开始新实验时,他们希望在有任何后续数据之前创建实验(基本上,您打开网络界面,单击“创建新实验”,填写实验详细信息,并且仅在他们完成第一个实验后的第二天跟进) 我可以在 SQL 中轻松做到这一点,在“实验表”中创建一个新行,稍后将在后续表中引用该行。 我如何使用 Elasticsearch 做到这一点?使用我建议的 json 文档,我需要创建一个“假”后续条目来创建实验,如果我对实验中的数据进行平均,则会损害结果,因为“后续”计数将产生 +1

  2. 在实验结束时更新实验数据(还不是必需的,但我期待客户的请求^^)。
    例如,如果科学家想要添加总体观察或实验结果,我将需要更新该实验的所有“后续”文档,这看起来不太好

有没有更好的方法来对我的数据进行非规范化以处理这两个用例?

database elasticsearch nosql denormalization
1个回答
0
投票

我尝试逐点回答。

  1. 从这个问题看来,在你的数据模型中你可以有两个不同的实体:
     experiments
    follow-up
    。它们之间存在依赖关系,其中
     experiment
     follow-up
    上具有等级优越性 。一个
     experiment
    可以独立于结果的存在而存在
    follow-up
    。所以我可以创建两个索引,每个索引对应实体:
experiment```

 could be:
  "experiment": {
    "experiment_id": "e1",
    "experiment_name": "...",
    "start_date": "2023-10-01T00:00:00",
    "lead_scientist": "John Doe"
    "plant_id": "aab"
    "plant_species": "..."
  }

还有

 follow-up
可能:

{
  "follow_up_id": "f1",
  "date": "2023-10-11T04:06:07",
  "bioMass": 4.6,
  "temperature": 23.6,
  "experiment_id": "e1",
  "plant_id": "aab"
}

钥匙在哪里

 "plant_id"
 "experiment_id"
其值在两个指数之间共享。通过这种方式,我可以检索有关针对该字段进行“多索引查询”的特定实验的所有后续信息。如果绝对必要,请勿在我的文档中创建嵌套字段,这一点非常重要。

如果您的科学家想要更新所有
    follow-ups
  1. 对于特定实验,它可以在
     follow-up
    上使用批量查询 updatebyquery 对与该特定匹配的所有文档建立索引
     experiment_id
    
        
© www.soinside.com 2019 - 2024. All rights reserved.