【发布时间】:2017-05-18 06:47:49
【问题描述】:
在我当前的项目中,我收到了一个大型 JSON 文件,我正在对其进行解析并存储到我的数据库中。问题是我觉得我正在以一种非常低效的方式构建我的数据库。
JSON 示例:
{
first_name: "John",
records: {
ids: [110, 725, 2250],
count: [1, 1, 6]
},
items: {
top: {
title: "My top",
values: { value: [51, 50, 70] }
},
middle: {
title: "Middle Stuff",
values: { value: [51] }
},
},
values: {
health: 100,
strength: 250,
mana: 50
}
}
如您所见,JSON 相当复杂,带有嵌套的对象。
在构建它时,我从主对象 (user) 开始,然后慢慢开始添加更多对象。 Values 很简单,所以我将其添加为另一个表,并仅引用 user_id。
然后我做了records,这有点复杂,但有效。但是,我非常担心嵌套最多的部分,可能是 5+ 个对象深。我觉得我不应该为一个简单的值设置一整列。
改善这一点的最佳方法是什么?我应该以某种方式处理数据并以不同的方式存储吗?
感谢您的帮助。
【问题讨论】:
-
您打算以后如何使用这些数据?您是一次需要所有数据,还是计划对数据运行复杂的查询或计算?您是否考虑过文档数据存储或 JSONB 列?你想优化写入或读取的数据结构,更重要的用例是什么?
-
我计划在收到数据后运行一些计算,存储结果,但稍后我需要显示部分数据。例如,我需要顶部的标题和稍后显示的值。全部在显示整个用户对象时同时进行。我主要担心读回对象,写作不应该经常发生。而且我还没有真正研究过任何其他类型,例如 JSONB。
-
创建一个合适的
User模型可能是一个更好的主意,而不是使用所有需要的属性并在保存时进行计算。 -
比如,当我得到所有的 JSON 时,找到我需要的方面,然后保存它们?这听起来像是我想做的事情,但我也想保持面向对象的东西,怎么说呢,取
values对象,并将其作为代码中的对象保存,但将其存储为,如 JSON在数据库中? -
如果用户只有
health(例如),那么拥有与用户 1:1 关联的专用值表没有任何好处。只需将health、strength、mana列直接添加到用户表中。如果用户可能有多个健康值,则创建一个新表并使其成为 has_many 关联。在不了解您的要求以及如何定义关联的情况下,很难就数据和表结构向您提供建议。item、value、record非常通用,我不确定它们在您的域中是如何连接的。
标签: ruby-on-rails json ruby database