将数组存储在数据库中

13

我想知道在数据库中存储数组是否是一种良好的实践?我倾向于使用json_encode而不是serialize,但只是想知道这是否是一个好主意。如果不是,那么我可以做出一些小改变,只需用逗号分隔符串联数组即可。


1
你是将整个数组存储在一个列中吗?你打算如何运行SQL语句来搜索条目? - aziz punjani
1
这是一个小的文件名数组,不是多维的或其他什么。它是一个包含要合并的文件的包(css和js但当然不是在一起)...意图不是搜索特定的文件。例如,在index.php上指定文件,它将返回相应的包ID。当然,问题是如果您以不同的顺序指定相同的文件-它会出错。重要的是顺序固定。你明白我的意思吗? - Jeanie Tallis
数组中既没有json_encode也没有serialize,你是指要存储字符串吗? - ajreal
是的,它基本上是一个字符串形式的数组。 - Jeanie Tallis
2个回答

48
不,这是一个糟糕的做法。请不要将CSV、JSON*、serialize()或任何类型的序列化数据插入到关系型数据库中。去规范化几乎总是个坏主意——除非你真的知道自己在做什么,否则不要这样做,否则你会开始问类似于这些问题这些问题这些问题这些问题等等。
这样做会使您失去或严重限制以下能力:
  • 使用JOIN
  • 查找或修改特定元素
  • 强制执行引用完整性
  • 从指数使用中获益
  • 它还浪费空间
看到人们这样做,虽然听起来有点小题大作,但它是我最讨厌的事情之一,尤其是考虑到大量在SO上提出的问题,如果他们按照正确的方式执行就可以避免。
这里是在RDBMS中执行一对多和多对多关系的正确方法*尽管一些SQL数据库内置了对JSON的支持,但重新构造数据通常更好,这样您就不需要使用JSON了。

不需要编辑包,但依赖于某些文件的其他页面可能会出现故障。你真正需要编辑它的唯一情况是在文件名中打错字,这时我可以理解为什么像这样存储数组并不有益。 - Jeanie Tallis
@Jeanie 如果你真的确定的话,我应该选择JSON。CSV不可靠,而且“serialize()”很容易出错,对我来说太啰嗦了。 - NullUserException
我目前正在使用json_encode... ajreal编辑了我的帖子,说CSV,但我不知道CSV是什么。 - Jeanie Tallis
@Jeanie 逗号分隔值 - NullUserException
啊,是的,如果使用 json_encode 和 serialize 是不好的选择,那么这将是我的另一个选择。我认为这应该是下一个最佳选项。 - Jeanie Tallis
5
非常正确!除非您确实知道自己在做什么,否则不要为了想象中的性能提升而进行反规范化。首先,您必须始终保持正常化形式,只有在遇到性能问题时,您才应该查看...不是反规范化,而是像索引、查询提示、重组织、物化视图等其他东西。反规范化是在追求性能时最后需要做的事情。 - Oybek

7
根据您的使用模式而定。如果您需要访问数组的较小部分(例如在where子句中使用),那么这是个坏主意 - 您会失去将数据存储在关系数据库中的所有好处,使数据不可关联。您最终将不断提取该小数据片段,从而产生重大开销。
另一方面,如果您只是将数据库用作数据存储,并且从不需要切割存储的数组 - 只需插入和检索,那么可能没有问题,除了可能浪费空间外,因为序列化/ json格式往往比原始数据本身占用更多的空间。

Json格式比序列化格式更小,至少对于我的数组大小是这样。这也是我喜欢json的原因之一。虽然是为了存储...和每页检索一次(也许甚至不需要每页,这取决于包) - Jeanie Tallis

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