序列化数据

简介:不要在数据库中存储序列化的数据,而是使用单独的列和/或表。这包括将逗号分隔的值存储为字符串。

Rails使得以JSON、YAML或其他格式存储序列化数据成为可能。这样的字段可以定义如下:

问题<ActiveRecord::模型序列化: custom_fields结束

虽然在数据库中存储序列化的数据可能很诱人,但这有许多问题。本文将概述这些问题并提供替代方案。

序列化的数据不那么强大

使用关系数据库时,您可以查询单个字段、更改模式、索引数据等等。当您使用序列化数据时,所有这些都变得非常困难或完全不可能。虽然PostgreSQL确实提供了查询JSON字段的功能,但它主要用于非常特殊的用例,而不是用于更一般的用途。如果反过来使用YAML,则根本无法查询数据。

浪费空间

存储诸如JSON或YAML之类的序列化数据最终会浪费大量空间。这是因为除了存储的数据之外,这些格式通常还包括额外的字符(例如双引号或换行符)。

难以管理

有时,您需要向序列化数据添加新字段,或更改现有字段。使用序列化的数据变得非常困难和耗时,因为这样做的唯一方法是重写所有存储的值。要做到这一点,你必须:

  1. 检索数据
  2. 将其解析为Ruby结构
  3. 变异,
  4. 将其序列化回字符串
  5. 将其存储在数据库中

另一方面,如果要使用常规列,添加列就像这样简单:

改变表格table_name添加column_name类型

这样的查询将花费很少的时间,并且可以立即应用于所有行,而不必重新编写大型JSON或YAML结构。

最后,当JSON或YAML结构不再足够时,您需要从它迁移出去。当只存储几行时,这可能不是问题,但是当存储数百万行时,这样的迁移很容易需要数小时甚至数天才能完成。

关系数据库不是文档存储

当将数据存储为JSON或YAML时,您本质上就像使用文档存储一样使用数据库(例如MongoDB),除非您不使用典型RDBMS提供的任何强大功能也不您是否使用了典型文档存储所提供的任何特性(例如,索引具有可变字段的文档字段的能力)。换句话说,这是浪费。

一致的领域

支持序列化数据的一个理由是必须存储变化很大的字段和值。有时情况确实如此,那么使用序列化数据可能是有意义的。但是,在99%的情况下,存储的字段和类型对于每一行都是相同的。即使存在细微的差异,您仍然可以使用单独的列,而不需要设置不需要的列。

解决方案

解决方案非常简单:只需使用单独的列和/或单独的表。这将允许您使用数据库提供的所有功能,它将使管理和迁移数据变得更容易,您将节省空间,您可以有效地索引数据等等。

Baidu
map