非规范化与儿童/父母与嵌套
我们正在设计弹性搜索模型的事件,他们的日程安排和场地,事件发生的地方。 设计是以下几点:查询非规范化与儿童/父母与嵌套
查找活动,这是音乐会,2017年1月7日和2017年7月7日
查找艺术家之间谁执行伦敦,而该事件剧院玩
查找事件,这是电影和有得分> 70%
个查找用户,谁参加活动AwesomeEvent
找到场地,这是本地伦敦,从今天起
我读过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"
}
],
...
}
优点:
- 更平坦模型,应该坚持 “键:值” 的方法
- 实体自行携带所有信息
缺点:以下实体之间
- 冗余数据的地块
- 更复杂的实体
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索引与正确的子字段映射,那么你可以添加尽可能多的你想要的。这将使您能够按表演者或演员按事件查找事件。这同样适用于其余的指数。
就父母子女vs嵌套,父子提供更多的依赖,因为子文档驻留在一个完全独立的索引。父子字段和嵌套字段都可以指定“include_in_parent”选项来自动将字段非规范化为
您尚不清楚。什么“模型”(s)?什么“反规范化”?什么“假设”?你似乎有2个设计 - 非弹性(关系)和弹性。请给他们。解释你将如何使用它们。你似乎有两个“问题” - 一个导致弹性,另一个导致弹性“反常化”。请解释他们。给你激励的假设/期望/权衡。 PS请编辑你的许多不清楚的句子和不明原因的连接。例如“当我在想......我担心......”,“对我而言......”,“喜欢......”,“实际上将所有数据存储在弹性中”以及“多余的信息“。 – philipxy
谢谢你的回应。我已经添加了简化模型,也(我希望)更清楚地指定了我一直在考虑的模型,并添加了一些示例。我还编辑了不清楚的句子。感谢您的反馈 – Radim
不确定您是否已阅读此文,但与本文中深入链接的[本文](https://www.elastic.co/guide/en/elasticsearch/guide/master/parent-child.html)你发布了一个很好的总结,说明为什么你可以选择嵌套vs父/子关系。这有帮助吗?还是有什么,你觉得文章是失踪? – aug