java - 如何在 SQL 列中存储用户生成的不同大小的字符串数组?
问题描述
我们正在尝试在数据库列中保存多个字符串。我们使用单列,因为数量不同,它可能在 15-50 之间,因此显然多列可能不可行。
另一个问题是数据是用户生成的。如果不是这种情况,我们将使用拆分字符并且不会出现问题,但是我们不能保证数据不会包含这些字符。
你们会建议什么来实现这一目标?
解决方案
通常,在数据库中,您有 3 个选项:
[最好,一般] - 嘿,它被称为“关系数据库”是有原因的,建立一个关系!将您的字符串存储在一个单独的表中,例如,您想存储某人拥有的宠物的名称,可以是从 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;
一些数据库引擎,例如 postgres,允许使用数组。JDBC 允许您阅读这些:
CREATE TABLE person (id int NOT NULL, .... other fields ...., pet_names text[]);
- 用于resultSet.getArray()
获取此数据,并且有大量的 SQL 原语可以搜索它们,请参阅 postgres 数组文档。[通常,迄今为止最糟糕的],使用转义机制将多个字符串压缩为单个格式化字符串的机制。您可以通过 JSON-izer 折腾字符串并存储结果数据,即
["Joe said. \"Hello!\" to me", "Bye!"]
作为字符串存储在数据库中。这完全是糟糕的,因为它几乎不可能使用数据库查询来搜索任何这些东西,而且没有充分的理由这样做。所以,不要。请注意,psql 实际上支持 'json' 作为列类型。与使用数组相比,我真的没有太多理由这样做(至少,与来自 JDBC 的交互与数组交互要复杂得多),但至少你可以写一个查询,比如说,选择所有拥有名为“Rover”的宠物的人,如果您将结果 jsonize 然后转储到 varchar/text 列中,这是不可行的。
您正在询问如何执行 #3,但也许您还没有真正考虑过这一点,或者您不知道选项 #1 和 #2。
推荐阅读
- asynchronous - 为等待中的对象字段分配新值会阻止进一步的说明
- html - 带有当前 URL 的 Facebook 评论计数器
- javascript - Webpack 无法解析库中使用的 @(别名)导入
- javascript - 将密码重置令牌插入未受保护的 NodeJS 路由
- css - Safari 不尊重 @Keyframes 不透明度/填充
- python - 如何使用 Flask-SQLAlchemy 从数据库中仅选择某些列?
- c++ - 修改 n 维矩阵的 TypedArray 位置
- spring-boot - 尽管存在`@Transactional`,为什么这些数据库修改不回滚?
- csv - 是否可以生成只读 CSV 文件?
- sql - 如何在 SQL Server 中选择满足某些条件的特定上一行