【发布时间】:2015-02-27 01:21:05
【问题描述】:
我正在考虑将 PostgreSQL 的 jsonb 列类型用于主要用作 REST-ful JSON API 的新后端项目。我相信 PostgreSQL 的 jsonb 非常适合这个项目,因为它会给我 JSON 对象,而无需在后端进行转换。
但是,我了解到 jsonb 数据类型在添加键时会变慢,并且我的架构将需要使用主键和外键引用。
我想知道是否在它们自己的列中包含主键/外键(以标准关系数据库方式),然后为其余数据设置一个 jsonb 列是否有益,或者这会导致问题(是否现在还是以后)?
简而言之,会:
table car(id int, manufacturer_id int, data jsonb)
表现好于或差于:
table car(data jsonb)
尤其是在频繁查找外键时?
从性能或架构的角度来看,第一个是否有缺点?
【问题讨论】:
-
你为什么要使用
jsonb?听起来您的架构或多或少是固定的,并且将行转换为 JSON 应该足够快,您无需担心。 -
好问题:我对我的架构需要的关系有一个很好的了解,但此时我对每个表需要的信息没有具体的了解,虽然每次我弄清楚这一点时,我都可以进行数据库迁移,我认为使用 jsonb 可以让我获得良好的性能以及一种快速添加内容的简单方法。也许稍后,一旦我对所需数据有了更具体的了解,我就可以回到良好的关系设置。但这与问题的重点无关,即:一个比另一个表现更好/更差吗?
-
但是无论如何你将不得不做一堆迁移来重写你的 JSON,这里和那里的几个 ALTER TABLE 不应该是可怕的,如果他们然后重写你所有的数据和代码跟踪一个不断变化的模式应该更可怕。就回答问题而言,首先您需要提出正确的问题。我认为你需要先弄清楚你的数据是什么样子,然后再开始到处乱扔数据。如果您认为您打算先行一步,然后返回并重新设计数据库,那么您几乎可以肯定是错误的,它不会发生。
-
如果我错了,请纠正我,但它接受任何 JSON 字符串的 jsonb 列类型的全部目的不是吗?因此,如果我想添加
car_color_hex_code或其他随机属性,我只需将其添加到 json 字符串并将其存储在 jsonb 列中,对吗?无需迁移。至于你的第二点:我怎样才能更好地以正确的方式提出这个问题?我只是想知道主键/外键是否会在 jsonb 列或它自己的列中更好地工作,以及将它放在外面会导致什么后果。有没有更好的方法来问这个问题? -
JSON 是(IMO)用于非结构化或松散结构化数据的,您可以将任何您想要的 JSON 放入
jsonb,但这并不意味着您应该这样做。我认为你甚至不能在jsonb中拥有一个带有源或目标的 FK,对于 PK 也是如此。使用jsonb可能对您的“随机属性包”有意义,但您不会有太多的完整性约束来帮助您保持数据的清洁和合理。除非你有真实数据的基准测试,否则性能问题很难回答。
标签: postgresql database-design foreign-keys jsonb