首页 > 解决方案 > 如何在 SQL 列中存储用户生成的不同大小的字符串数组?

问题描述

我们正在尝试在数据库列中保存多个字符串。我们使用单列,因为数量不同,它可能在 15-50 之间,因此显然多列可能不可行。

另一个问题是数据是用户生成的。如果不是这种情况,我们将使用拆分字符并且不会出现问题,但是我们不能保证数据不会包含这些字符。

你们会建议什么来实现这一目标?

标签: java

解决方案


通常,在数据库中,您有 3 个选项:

  1. [最好,一般] - 嘿,它被称为“关系数据库”是有原因的,建立一个关系!将您的字符串存储在一个单独的表中,例如,您想存储某人拥有的宠物的名称,可以是从 0 到很多的任何数字:CREATE TABLE person_pets (id int NOT NULL, person_id int FOREIGN KEY REFERENCES persons(id), pet_name varchar NOT NULL, PRIMARY KEY(id));注意:假设一个非愚蠢的数据库引擎(通常mysql 算作傻,所以尽量不要使用数据库的灾难),您可以返回一行并且仍然拥有所有宠物名称,例如:SELECT person.name, ARRAY_AGG(pet.name) AS petNames FROM person LEFT JOIN pets ON pets.person = person.id ORDER BY person.name;

  2. 一些数据库引擎,例如 postgres,允许使用数组。JDBC 允许您阅读这些:CREATE TABLE person (id int NOT NULL, .... other fields ...., pet_names text[]);- 用于resultSet.getArray()获取此数据,并且有大量的 SQL 原语可以搜索它们,请参阅 postgres 数组文档。

  3. [通常,迄今为止最糟糕的],使用转义机制将多个字符串压缩为单个格式化字符串的机制。您可以通过 JSON-izer 折腾字符串并存储结果数据,即["Joe said. \"Hello!\" to me", "Bye!"]作为字符串存储在数据库中。这完全是糟糕的,因为它几乎不可能使用数据库查询来搜索任何这些东西,而且没有充分的理由这样做。所以,不要。请注意,psql 实际上支持 'json' 作为列类型。与使用数组相比,我真的没有太多理由这样做(至少,与来自 JDBC 的交互与数组交互要复杂得多),但至少你可以写一个查询,比如说,选择所有拥有名为“Rover”的宠物的人,如果您将结果 jsonize 然后转储到 varchar/text 列中,这是不可行的。

您正在询问如何执行 #3,但也许您还没有真正考虑过这一点,或者您不知道选项 #1 和 #2。


推荐阅读