当前位置: 首页 > 知识库问答 >
问题:

在数据库中存储字符串数组

曾弘扬
2023-03-14

我有一个通过ORM保存到数据库的对象。对象有一个字符串数组,每个对象的数组长度可以不同。我想知道在db中存储字符串数组的标准做法(例如,我是否应该将所有字符串存储在一个字段中作为csv等)?

共有1个答案

盖斌
2023-03-14

我想你有一个MySql,关系数据库。作为第一种方法,您必须认为在关系数据库的字段中插入任何类型的组合数据(CSV、JSON、serialize())都是您应该避免的事情。这是我在大学学习数据库时学到的第一件事。这是因为在设计数据库时,第一种方法应该是数据库规范化。

非规范化是在寻找性能时常用的方法。要做到这一点,您需要在数据库方面有丰富的经验(建模、访问等)。这是有经验的DBA和商业智能专业人员所做的事情,但如果你真的不知道自己在做什么,就不必尝试。

因此,您的目标是设计一个规范化的数据库。为什么这不利于数据库规范化?我们知道有几种“范式”,它们决定了表对逻辑不一致和异常的免疫程度。如果你看一下第一范式的定义

第一范式(1NF)是关系数据库中关系的属性。如果每个属性的域仅包含原子值,并且每个属性的值仅包含该域中的单个值,则关系处于第一范式。

因此,当您在字段中保存数组时,您的数据库甚至不是第一个标准形式。

不这样做的一些实际原因是:

  • 您不能使用JOIN
  • 不能使用索引
  • 搜索、筛选、排序并不容易
  • 参考能力丧失
  • 如果您真的不知道自己在做什么,那么应用层的性能会更差

的确,有些人(如Joomla)存储实体的不太重要的数据,例如字段中的非关键配置值。最好的方法可能是使用serialize()。这里有一个关于何时可以考虑这样做的解释。但同样,只有当你真的知道自己在做什么,并且你真的需要它时,你才应该这样做

如果您需要更多参考资料,可以阅读以下内容:

  • http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db2z10.doc.intro/src/tpc/db2z_denormalizationforperformance.htm
  • https://dba.stackexchange.com/questions/4622/when-should-you-denormalize
  • http://searchdatamanagement.techtarget.com/definition/denormalization

这个SO也回答:

  • https://stackoverflow.com/a/4310112/2357411
 类似资料:
  • 问题内容: 尝试使用javax.crypto库对字符串进行加密并将其存储在数据库(Oracle)中。稍后我将需要解密此字符串,因此我需要双向算法。 问题是数据库似乎不接受该方法创建的某些加密字符。我们介于将数据库迁移到新服务器之间。旧数据库使用US7ASCII字符集,而新数据库使用AL32UTF8。当我将加密的字符串放入数据库中时,数据库只是将它们转换为US7ASCII数据库中的问号(?)。它似乎

  • Java MySQL数据库我正在做一个项目,将一个路径名为“C:\Desktop\”的字符串保存到数据库中。我已经创建了一个实体类来将此路径名更新到数据库中,在javaeclipse中,当我运行程序时,它会显示路径以这种格式存储在数据库中,即“C:\Desktop\”,但在该路径的数据库列中,它只存储“C:Desktop”,没有“\”

  • 问题内容: 我有一个webapp,它在MySQL数据库中存储法语文本(可能包含重音字符)。通过PHP直接检索数据时,带重音的字符变得乱码。例如: 因此,我使用(或)将字符串转换为html实体,一切都很好。但是,当我输出包含重音字符和HTML元素的数据时,事情变得更加复杂。例如,被转换为浏览器,因此浏览器无法理解。 如何同时正确显示重音字符和正确解析HTML? 谢谢! 问题答案: 也许你可以看看和

  • 1366字符串值不正确:“\XF0\X9F\X98\X83\XF0\X9F..."第1行的“comment”列

  • 问题内容: 我有下表: 我使用以下SQL语句将值存储在表中 现在,我尝试将以下字符串存储为“文本”。 我收到以下错误消息: 错误:您的SQL语法有误。查看与您的MySQL服务器版本相对应的手册,以获取正确的语法以在“ t’t cur”中使用;我需要一些咖啡。’)’在第1行 我认为这一定是一个非常普遍的问题。我该如何解决? 问题答案: 我建议使用准备好的语句(使用mysqli或pdo),而不是转义。

  • 问题内容: 因此,在C ++ / C#中,您可以创建标志枚举来保存多个值,并且在数据库中存储单个有意义的整数当然是微不足道的。 在Java中,您有EnumSets,这似乎是在内存中传递枚举的一种很好的方法,但是如何将组合的EnumSet输出为整数进行存储?还有另一种方法可以解决这个问题吗? 问题答案: