2010-01-08 130 views
3

在Facebook FQL页面上显示了FQL表格结构,下面的截图显示了它的一些内容(屏幕截图消失了)。在MySQL中存储数组?

您会注意到有些项目是一个数组,例如meeting_sex,meeting_for current_location。我只是好奇,你认为他们将它作为一个数组存储在mysql中,或者只是将它作为一个返回,从这些数据中它真的让我认为它存储为一个数组。如果你认为它是这样的,或者你已经做了类似的事情,那么将这些项目作为一个数组存储到一个表字段然后在PHP页面上将其检索为一个数组的方法是什么?

alt text http://img2.pict.com/3a/70/2a/2439254/0/screenshot2b187.png

回答

5

有用于存储作为数组两个选项:

第一,你所提到的,是使1个或多个,表和枚举要存储的每个可能的密钥。这是搜索和使数据有意义的最佳选择。

但是,对于您想要执行的操作,请使用serialize()。注意:请勿EVER EVER EVER尝试使用其原始字符串形式对该数据进行搜索。只需重新加载它,请致电unserialize(),然后搜索您的标准,而不是开发一些疯狂的搜索模式来执行您的出价。编辑:如果是我,并且这是我为其他人使用(或者甚至为了我自己使用,完全诚实)而认真开发的东西,那么我可能会创建第二个查找表来存储所有的键作为专栏;哎呀,如果你这样做,mysql_fetch_assoc()可以通过运行第二个快速查询给你你想要的数组(或者你可以通过JOIN ed查询将它们提取出来)。但是,如果这只是快速而肮脏的以完成任何工作,那么序列化数组可能适合您。除非你真的,真的不在乎搜索那些数据,否则我认为大多数人会认同,更好的是正确的列与键之间的关系。

+0

哦,但是当他最终解决所有想要实现的小错误和额外功能时,发现搜索那些“序列化”字段就是其中之一,现在试图解决问题已经太迟了没有超过仅仅使其“简单”节省的成本。 – 2010-01-08 22:49:50

+0

是的,为了达到这个效果,我在文章末尾添加了一个附录,我绝对同意你的看法。一旦你走上了这条道路,这将会是六种噩梦,除了一个超级好玩的任务,就是将所有这些数据全部加载并用PHP解析它,无论如何,在这一点上你真的只是实现你自己的非常草率和低效率的数据库管理系统。 – Dereleased 2010-01-08 22:52:16

+0

所以如果它只是几个关键值反正而不是数组或其他表也许我应该将它们添加到当前表? – JasonDavis 2010-01-08 22:53:53

1

您可以序列化数组,插入它,然后在检索它时将其反序列化。

11

将数组存储在数据库中的正确方法是将其存储为表,其中数组的每个元素都是表中的一行。

其他一切都是黑客,最终会让你后悔你试图避免多余的表的决定。

0

它们可能使用多个表具有多对多关系,但使用连接和MySql的GROUP_CONCAT函数将值作为数组返回为一个查询中的这些列。

2

将它拆分成其他表格。你可以对它进行序列化,但是这可以保证你稍后想要查询这些数据。稍后保存自己的挫折感,然后立即将其分开。

5

保证你说Facebook没有将数据存储在数据库中的数组中。

你必须认识到关于FQL的一点是你不直接查询Facebook的主数据服务器。 FQL是一个外壳,旨在为您提供对基本社交数据的访问,而不会让您在具有性能要求的真实服务器上运行疯狂查询。主数据库上任意用户创建的查询将是功能性自杀。

FQL提供了一个设计良好的数据返回结构,可方便查询您正在查询的数据类型,因此,任何可以具有多个关联的数据片段(如“meeting_for”)都会打包成一个数组作为API结果返回之前。

正如其他海报所提到的,在数据​​库内存储一个编程语言结构(如数组或对象)的唯一方法就是serialize它。序列化是昂贵的,只要序列化一些东西,就会使其无法用于索引和搜索。作为一个社交网络,Facebook需要对几乎所有内容进行索引和搜索,因此这些数据在主模式中绝不会以数组形式存在。

通常情况下,您曾经想将序列化数据存储在数据库中的唯一时间是临时数据,例如会话数据,或者您有一个有效的性能要求。否则,你的数据很快变得毫无用处。

+0

是的,我现在看到,它只是让我停下来,思考了一会儿,当我看到那个时候,所以我想现在问我,在我的新项目的早期阶段 – JasonDavis 2010-01-08 23:08:10

+0

有确实有效的理由来存储序列化的数据,但你不想养成它的习惯;) – zombat 2010-01-08 23:13:05