最佳实践:将空字段保存为空或完全省略字段并管理代码中的缺失字段?

时间:2015-01-29 17:56:18

标签: java json mongodb

鉴于将有5000多万份文件的集合, 每个文档都有最大字段数(如选项a所示) 处理可以为null /稀疏的字段的最佳做法是什么?

a)将具有相同字段和空字段的每个文档保存为null是否更好?

{
  "_id": "54ca5b234d2dfeba4f9ab613",
  "person_id": 1,
  "person_name": "Bob",
  "office_phone": null,
  "description": "This is where the description is entered",
  "technical_description": null

}

b)或者,如果他们没有数据,最好省略字段吗?

{
  "_id": "54ca5b234d2dfeba4f9ab613",
  "person_id": 1,
  "person_name": "Bob",
  "description": "This is where the description is entered",
}

mongod内存使用和性能方面保留字段为null的注意事项是什么? 基本上省略空的字段会产生一种情况,即应用程序需要实现检查字段是否存在的方法。 如果将此“空检查”委托给代码,应该在应用程序级别进行哪些考虑?它很重吗? 如果集合中的字段为空,则省略该字段只会将沉重代表委托给客户端代码层吗?

1 个答案:

答案 0 :(得分:2)

我的建议是将它们留空并检查该字段是否存在。文档数据库相对于关系数据库的一个缺点是,表只需要提供一次列的名称,而每个文档必须提供该文档中每个字段的名称。

因此,考虑到您有5000万个文档且字段名称technical_description长度大约为20个字符,因此每个文档中只有一个密钥名称才会使用超过1 GB的存储空间。如果您的一半文档的值为null,那么这至少是GB完全浪费空间的一半。

如果文档已加载到内存中,则用于RAM中。使用索引时,索引将被放入内存中,然后发送到客户端的任何文档都需要在被要求时放入内存。通常不是所有文档都是一次访问的,MongoDB已经内置了一个游标对象。

另一方面,我并不熟悉Java中确定某个对象没有某个字段的重要程度,但它看起来应该是一个相当轻松的操作。