最佳实践:将空字段保存为 null 或完全省略字段并在代码中管理缺失字段?
Best Practices: Save Empty Fields as null or omit Field Completely and Manage Missing Fields in Code?
给定的集合将包含 50+ 百万个文档,
每个文档都有最大数量的字段(如选项 a 所示)
处理可以是 null/sparse 的字段的最佳做法是什么?
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
内存使用和性能方面,将字段保留为空有哪些注意事项?
本质上省略空字段会造成应用程序需要实现一种方法来检查字段是否存在的情况。
如果把这个"empty check"委托给代码,在应用层应该有哪些考虑?重吗?
如果集合中的字段为空,是否会省略它们只是将重量委托给客户端代码层?
我的建议是将它们保留为空并检查该字段是否存在。文档数据库相对于关系数据库的一个缺点是 table 只需提供一次列名,而每个文档都必须提供该文档中每个字段的名称。
因此考虑到您有 5000 万份文档并且字段名称 technical_description
大约有 20 个字符长,将有超过 1 GB 的存储空间用于说明每个文档中的一个键名称。如果您的一半文档的值为 null
,那么至少有一半的 GB 完全浪费了 space。
如果将文档加载到内存中,space将在 RAM 中使用。当使用索引时,索引将被放入内存,然后发送给客户端的任何文档都需要按要求放入内存。通常不会同时访问所有文档,并且 MongoDB 已使用游标对象内置分页。
另一方面,我不太了解在Java中确定一个对象不具有某个字段的操作有多繁重,但它似乎应该是一个相当轻的操作。
给定的集合将包含 50+ 百万个文档, 每个文档都有最大数量的字段(如选项 a 所示) 处理可以是 null/sparse 的字段的最佳做法是什么?
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
内存使用和性能方面,将字段保留为空有哪些注意事项?
本质上省略空字段会造成应用程序需要实现一种方法来检查字段是否存在的情况。
如果把这个"empty check"委托给代码,在应用层应该有哪些考虑?重吗?
如果集合中的字段为空,是否会省略它们只是将重量委托给客户端代码层?
我的建议是将它们保留为空并检查该字段是否存在。文档数据库相对于关系数据库的一个缺点是 table 只需提供一次列名,而每个文档都必须提供该文档中每个字段的名称。
因此考虑到您有 5000 万份文档并且字段名称 technical_description
大约有 20 个字符长,将有超过 1 GB 的存储空间用于说明每个文档中的一个键名称。如果您的一半文档的值为 null
,那么至少有一半的 GB 完全浪费了 space。
如果将文档加载到内存中,space将在 RAM 中使用。当使用索引时,索引将被放入内存,然后发送给客户端的任何文档都需要按要求放入内存。通常不会同时访问所有文档,并且 MongoDB 已使用游标对象内置分页。
另一方面,我不太了解在Java中确定一个对象不具有某个字段的操作有多繁重,但它似乎应该是一个相当轻的操作。