在本文中,您将了解何时应该考虑向表中添加JSON数据类型,以及何时应该避免它。
大多数关系数据库技术现在可以存储JSON数据并对其执行查询。将JSON数据类型引入关系数据库代表了一个转折点,并开辟了许多新的可能性。考虑到这个特性的创新性,您可能对采用JSON数据是否是正确的选择有一些疑问。特别是,滥用JSON并失去关系模型好处的风险很高。这就是为什么清楚地理解JSON数据给关系数据库带来的优缺点是如此重要。
在本文中,我们将探讨您需要了解的有关JSON列的所有信息,并告诉您何时最好依赖它们。
什么是JSON?
JSON代表对象表示法并表示一种轻量级、易于理解、人类可读的数据格式。在关系数据库中,JSON数据类型是一个特殊的二进制或文本列,允许您以JSON格式存储数据。下面是一个JSON示例:
{ "user": { "id": "1", "name": "Maria", "surname": "Williams", "hobbies": [ { "name": "Tennis", "since": 1985 }, { "name": "Reading", "since": 1974 } ] } }
复制
支持JSON的关系数据库通常都带有特定于JSON的函数和运算符来查询和执行此数据类型的操作。例如,您可以进一步了解PostgreSQL在JSON数据方面所提供的功能在这里 .
为什么关系数据库支持JSON?
随着时间的推移,提供给用户的功能变得越来越复杂。因此,支持应用程序的正确数据结构不太可能是纯关系的。数据的重要性日益增加,表示数据的方法也在相应地发展。开发关系数据库技术的人知道这一点,并引入了JSON数据类型来支持新的数据思维方式。
MySQL从版本5.7它在2015年开始向公众开放,PostgreSQL从那时起就支持JSON数据类型版本9.2,于2012年发布。此后,SQL Server一直支持JSONSQL Server 2016如您所见,大多数最流行的RDBMSE都具有存储JSON数据的能力。这并不意味着关系模型正在消亡或不再有用。相反,它只是在发展和适应新的需要。
毕竟,关系数据库技术只支持JSON作为数据类型。这意味着您可以向关系表中添加一个或多个JSON列。这并没有从根本上破坏关系方法,只是一种可能性,一种有用且强大的特性。
何时在关系数据库中存储JSON数据
接受JSON数据类型并将JSON列添加到表中可以为关系模式带来一些好处。在完成下面定义的几个目标时尤其如此。
使用JSON进行日志记录
您应该能够轻松地读取和理解日志数据,JSON格式是存储日志数据的好方法。因此,您应该考虑将日志数据转换为JSON格式并将其存储在JSON列中。此外,拥有一个包含日志数据的JSON列是通过查看一行来跟踪发生了什么的有效方法。使用这种方法,您不必定义新表、执行联接或花费时间检索日志数据。
JSON列对于记录数据的来源也很有用,尤其是在通过API导入数据时。考虑到API响应通常是JSON格式的,将它们存储在JSON列中是一个不费吹灰之力的解决方案,以避免丢失这些数据,并在需要时使用它。
存储权限和配置
并非所有用户都可以访问应用程序的相同功能和部分。类似地,每个用户都可以根据自己的偏好配置应用程序。这是两种常见的场景,涉及的数据随着时间的推移会发生很大的变化。这是因为您的应用程序可能会演变,包括新的配置、视图、特性和部分。因此,必须不断更新关系模式以匹配新的数据结构。这需要时间和精力。
相反,您可以将权限和配置存储在直接连接到用户表的JSON列中。此外,JSON是一种很好的权限和配置数据格式。实际上,您的应用程序可能会以JSON格式处理这些数据。
避免在高度嵌套的数据上执行缓慢
如果性能是一个关键要求,并且您的应用程序涉及高度嵌套的数据,那么您应该考虑JSON列。当你必须把它作为一个整体来使用时,这一点尤其正确。在关系方法中,您必须将数据组织在多个表中。要取回它,你必须嵌套几个JOINs、 这会使查询非常慢。
相反,通过将这些嵌套数据存储在JSON列中,可以使用SELECT查询。这将使您的数据检索过程更快,同时保持您的数据结构简单。
何时避免关系数据库中的JSON数据
有些人考虑将JSON数据类型用作反模式,并谨慎采用。原因是使用没有约束(如JSON)的格式会破坏关系模式。具体来说,在以下情况下应该避免使用JSON。
您不确定要在JSON列中存储什么数据
JSON格式是灵活的,但这意味着您可以使用它来存储您想要的任何内容。在将JSON列添加到数据库之前,必须清楚地定义它们的用途。否则,它们很可能成为垃圾抽屉。如果发生这种情况,对应用程序的未来可能会造成致命的后果。避免这种情况的唯一方法是为JSON列设计一种数据格式。
如果不知道如何使用JSON列,请避免使用它们。有JSON列,但不在其中存储JSON数据意味着在数据库级别没有数据验证,这可能导致在应用程序级别上没有一致性或完整性。
您不想处理复杂的查询
以JSON格式存储数据很酷,但别忘了,这会带来额外的成本和复杂性。其中之一是在JSON列中查询数据会导致更复杂的查询。
在PostgreSQL中,涉及JSON列的查询如下所示:
下面是在传统场景中等效查询的外观:
第二种方法更易于阅读和理解——如果JSON带来的好处不足以证明新查询的复杂性,则应避免使用JSON。
你有一个强类型ORM
使用强类型映射数据库时ORM公司技术方面,您可能会遇到涉及数据类型的问题。这是因为数据库级别的数据类型不同于应用程序级别的数据类型。当您想在应用程序级别处理存储在JSON列中的数据时,有两种方法。
第一种方法是将ORM映射中的JSON列定义为字符串,然后将它们转换为对象。否则,如果ORM支持此选项,则可以使用自定义结构化类型映射列。无论哪种情况,应用程序或ORM都必须在后台执行数据转换。这是有代价的,并且会损害后端性能。
结论
数据已经发展,关系模型可能不再足以有效地表示数据。这就是为什么一些最流行的关系数据库技术的供应商引入了使用JSON数据类型处理非结构化数据的方法。多亏了这个,你可以介绍NoSQL在关系数据库中的优势。在这里,我们研究了JSON数据类型是什么,引入它的原因,以及何时使用或避免它。一定要在我们的博客上留下更多的内容,直到下次。
原文标题:When to Use JSON in Your Database
原文作者:Antonello Zanini
原文地址:https://dzone.com/articles/when-to-use-json-in-your-database