根据主题,我有一个 varchar 字段,其中存储了一些用逗号分隔的数字。该列表会根据客户的选择而增长和缩小。然后我在查询中使用它来检查特定值是否在该列表中
value || ','
它运行良好,但正在考虑将其转换为整数数组。
这在技术/性能方面和正确编程数据库方面都是更好的解决方案吗?
根据主题,我有一个 varchar 字段,其中存储了一些用逗号分隔的数字。该列表会根据客户的选择而增长和缩小。然后我在查询中使用它来检查特定值是否在该列表中
value || ','
它运行良好,但正在考虑将其转换为整数数组。
这在技术/性能方面和正确编程数据库方面都是更好的解决方案吗?
最好的方法很可能是
sometable(main_id, value)
您在(main_id, value)
. 这允许非常快速的查找来查看“对于这个 mainid,这个值是否存在”。这将让您强制执行外键关系。除非您有充分的理由,否则请使用这种传统的关系方法。如果做不到这一点,您可以并且应该使用数组字段而不是逗号分隔的列表。从设计的角度来看,使用逗号分隔的列表是非常可怕的。它使查询更难编写,更容易出错,并迫使您只为简单的操作进行大量缓慢且低效的字符串操作和数字解析,并在没有非常低效的
CHECK
约束或触发器的情况下阻止任何类型的完整性检查。我认为比尔把它钉在了:使用数组,您可以使用
intarray
扩展来提供 GiST 索引,让您可以使用可索引或操作快速测试数组是否包含给定值。您可能还想添加扩展,因此您可以创建 的复合 GiST 索引,以防您的查询通常采用以下形式:@>
<@
btree_gist
main_id, the_values_array
(或者有两个单独的索引,看看它是否会进行位图索引扫描)。
您还不能在 PostgreSQL 中将外键关系强制到数组中,尽管该功能似乎正在开发中。同时,您需要使用一些复杂的触发器来执行此操作。尽管如此,它还是比逗号分隔的列表好得多。