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

4

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


“最佳”标准是什么?需要存储空间、性能等。 - Guido Leenders
我应该说“标准”做法,而非“最佳”做法,以解决这个问题。 - Andre Perkins
你使用的是哪种数据库系统,或者需要一个独立于数据库的解决方案?另外,你使用的ORM映射器是什么,它的要求是什么? - Patrick Hofman
1个回答

10
我猜你有一个 MySql 关系数据库。作为第一种方法,你必须考虑到在关系数据库的字段中插入任何类型的组合数据(CSV、JSON、serialize()),这是你始终应该避免的事情。这是我在大学学习数据库时了解到的第一件事。这是因为当你设计一个数据库时,你的第一步应该是数据库规范化反规范化是在追求性能时常用的方法。为了做到这一点,你需要在数据库方面有丰富的经验(建模、访问等)。这是有经验的DBA和商业智能专业人士所做的事情,但如果你真的不知道自己在做什么,就不要尝试。
所以,你的目标是设计一个规范化的数据库。为什么这与数据库规范化相悖呢?我们知道有几个“正常形式”,它们确定了表对逻辑不一致性和异常的免疫程度。如果你看一下第一正常形式的定义:

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

所以,当你将数组保存在一个字段中时,你的数据库甚至不符合第一正常形式。
不这样做的一些实际原因包括:
  • 无法使用JOIN操作
  • 无法使用索引
  • 搜索、过滤、排序不容易
  • 失去了进行引用的能力
  • 如果你真的不知道自己在做什么,应用层的性能会更差。
有些人(就像Joomla一样)确实会将实体的次要数据,例如非关键配置值存储在一个字段中。对于这种情况,最好的方法可能是使用serialize()。你可以在这里找到何时考虑这样做的解释。但是请记住,只有在你真正知道自己在做什么并且确实需要时才应该这样做。
如果你想要更多参考资料,你可以阅读这个: 而且还有这个SO的答案:

1
太棒了,正是我正在寻找的。谢谢! - Andre Perkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接