在数据库中存储数组

时间:2011-09-09 16:37:02

标签: php database serialization json denormalized

我想知道将数组存储在数据库中是否真的很好?我倾向于使用json_encode而不是serialize,但只是想知道这是不是一个好主意。如果没有,那么我可以做一些小改动,然后用逗号破坏数组。

2 个答案:

答案 0 :(得分:47)

不,这是一种可怕的做法。请不要在关系数据库中插入CSV,JSON *,serialize()或任何类型的序列化数据。非规范化几乎总是一个坏主意 - 除非你真的知道自己在做什么,否则不要这样做,否则你就会开始问 问题包括:thisthisthisthis,...

这样做,你输了或严重阻碍了你的能力:

  • 使用JOIN s。
  • 查找或修改特定元素
  • 强制参照完整性
  • 从索引使用中获益
  • 它也浪费空间

这可能听起来很迂腐,但看到人们这样做是我的一个小小的烦恼 - 特别是考虑到过多的问题,如果他们采取正确的方式就可以避免。

这是the right way在RDBMS中执行一对多和多对多关系。

* 虽然有些SQL数据库内置了对JSON的支持,但通常最好重构数据,这样就不需要了

答案 1 :(得分:7)

取决于您的使用模式。如果您需要访问数组的较小部分(例如,用于where子句或类似部分),那么这是一个坏主意 - 通过使数据不相关,您将失去将数据存储在关系数据库中的所有好处听上去很像。你最终将会有大量的开销,一遍又一遍地提取这一小块数据。

另一方面,如果您只是将数据库用作数据存储而且永远不需要将存储的数组分开 - 只需插入和检索,那么可能根本没有问题,除了可能浪费空间,因为序列化/ json'd格式往往是“罗嗦”并占用比原始数据本身更多的空间。