在数据库中存储字符串数组
Posted
技术标签:
【中文标题】在数据库中存储字符串数组【英文标题】:Storing an Array of Strings in a database 【发布时间】:2014-02-05 17:47:12 【问题描述】:我有一个通过 ORM 保存到数据库的对象。该对象有一个字符串数组,每个对象的数组长度可能会有所不同。我想知道将字符串数组存储在数据库中的标准做法(例如,我是否应该将所有字符串作为 csv 存储在一个字段中,等等.) ?
【问题讨论】:
“最好”的标准是什么?所需的存储空间、性能等。 对于这样的问题,我想我应该说的是“标准”实践,而不是“最佳”。 您使用的是什么数据库系统,或者它是否需要独立于数据库的解决方案?另外,您使用的是什么 ORM 映射器,它的要求是什么? 【参考方案1】:我猜你有一个 mysql,关系数据库。
作为第一种方法,您必须考虑插入任何类型的组合数据(CSV、JSON、serialize()
)在字段中 关系型数据库,是您应该始终避免使用的东西。这是我在大学学习数据库时学到的第一件事。这是因为当你设计一个数据库时,你的第一个方法应该是Database normalization。
Denormalization 是寻找性能时常用的东西。为此,您需要在数据库(建模、访问等)方面拥有丰富的经验。这是经验丰富的 DBA 和商业智能专业人员所做的事情,但如果您真的不知道自己在做什么,则无需尝试。
因此,您的目标是设计一个规范化的数据库。为什么这违反数据库规范化?好吧,我们知道有几种“正常形式”,它们决定了表格对逻辑不一致和异常的免疫程度。如果你看一下First normal form的定义
第一范式 (1NF) 是关系中关系的属性 数据库。一个关系是第一范式,如果每个的域 属性只包含原子值,并且每个属性的值 仅包含来自该域的单个值。
因此,当您在字段中保存数组时,您的数据库甚至不是第一范式。
不这样做的一些实际原因是:
您不能使用 JOIN 您不能使用索引 搜索、过滤、排序,并不容易 失去参考的能力 如果你真的不知道自己在做什么,应用层的性能会更差。确实有些人(像 Joomla 一样)会存储不太重要的实体数据,例如字段中的非关键配置值。最好的方法可能是使用serialize()。 Here 你有解释什么时候可以考虑这样做。但同样,只有当你真的知道你在做什么并且你真的需要它时,你才应该这样做
如果您想要更多参考资料,可以阅读以下内容:
http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.intro%2Fsrc%2Ftpc%2Fdb2z_denormalizationforperformance.htm https://dba.stackexchange.com/questions/4622/when-should-you-denormalize http://searchdatamanagement.techtarget.com/definition/denormalization还有这个答案:
https://***.com/a/4310112/2357411 https://***.com/a/16132444/2357411 https://***.com/a/5341286/2357411 https://***.com/a/10399902/2357411 https://***.com/a/17371729/2357411【讨论】:
太棒了,正是我想要的。谢谢!以上是关于在数据库中存储字符串数组的主要内容,如果未能解决你的问题,请参考以下文章