我一直在关注NoSql运动的兴起以及像mongodb、ravendb等文档数据库的流行。虽然我喜欢这些东西的很多方面,但我感觉我还没有理解重要的东西。
比如说你正在实现一个商店应用程序,并且你想要将产品存储在数据库中,所有产品都有一个单独且唯一的类别。在关系型数据库中,这可以通过两个表来完成,一个是产品表,另一个是类别表,产品表会有一个字段(可能称为“category_id”),该字段将引用类别表中持有正确类别条目的行。这样做有几个好处,包括数据不重复。
这也意味着,如果你拼错了类别名称,你可以更新类别表,然后就可以修复它,因为那是唯一存在的值所在的地方。
然而,在文档数据库中,情况并非如此。你完全去规范化,也就是说,在“产品”文档中,你实际上需要包含一个保存实际类别字符串的值,导致大量数据重复,错误更难以纠正。再深入思考,这是否也意味着运行查询语句,比如“给我所有属于这个类别的产品”,会导致不具备完整性的结果呢?
当然,解决这个问题的方法是在文档数据库中重新实现整个“category_id”功能,但当我思考到那一步时,我意识到我应该继续使用关系型数据库而不是重新实现它们。
这让我相信我错过了一些关键点,导致我沿着错误的道路前进。所以我想询问 stack-overflow,我错过了什么?
比如说你正在实现一个商店应用程序,并且你想要将产品存储在数据库中,所有产品都有一个单独且唯一的类别。在关系型数据库中,这可以通过两个表来完成,一个是产品表,另一个是类别表,产品表会有一个字段(可能称为“category_id”),该字段将引用类别表中持有正确类别条目的行。这样做有几个好处,包括数据不重复。
这也意味着,如果你拼错了类别名称,你可以更新类别表,然后就可以修复它,因为那是唯一存在的值所在的地方。
然而,在文档数据库中,情况并非如此。你完全去规范化,也就是说,在“产品”文档中,你实际上需要包含一个保存实际类别字符串的值,导致大量数据重复,错误更难以纠正。再深入思考,这是否也意味着运行查询语句,比如“给我所有属于这个类别的产品”,会导致不具备完整性的结果呢?
当然,解决这个问题的方法是在文档数据库中重新实现整个“category_id”功能,但当我思考到那一步时,我意识到我应该继续使用关系型数据库而不是重新实现它们。
这让我相信我错过了一些关键点,导致我沿着错误的道路前进。所以我想询问 stack-overflow,我错过了什么?