一个多维数组与多个具有连接行的表

时间:2017-05-19 14:40:18

标签: php mysql arrays serialization multidimensional-array

我正在建立一个列表网站(没有什么特别的,人们可以创建列表,例如'要观看的电影'或'要做'但是学习东西很好。)

当前情况: 人们注册,我在users表格中为他们创建了一行。在该行中,我有一个名为Lists的列。在此列中,我存储了serialized array,其结构如下:

$lists = array(
            "To Do" => array(
                                "List Info" => array(
                                                    "add date" => 20170503,
                                                    "add time" => 130530
                                                    ),
                                array(
                                                    "item" => "Go to the supermarket",
                                                    "add date" => 20170503,
                                                    "add time" => 140503,
                                                    "completed" => false
                                                    ),
                                array(
                                                    "item" => "Clean my room",
                                                    "add date" => 20170503,
                                                    "add time" => 180503,
                                                    "completed" => false
                                                    ),
                                array(
                                                    "item" => "Go jogging",
                                                    "add date" => 20170503,
                                                    "add time" => 200503,
                                                    "completed" => true
                                                    )
                            ),
            "Movies To Watch" => array(
                                "List Info" => array(
                                                    "add date" => 20170504,
                                                    "add time" => 130530
                                                    ),
                                array(
                                                    "item" => "Zootopia",
                                                    "add date" => 20170504,
                                                    "add time" => 150503,
                                                    "completed" => true
                                                    ),
                                array(
                                                    "item" => "Anne The Series",
                                                    "add date" => 20170504,
                                                    "add time" => 190503,
                                                    "completed" => false
                                                    ),
                                array(
                                                    "item" => "Upside Down",
                                                    "add date" => 20170505,
                                                    "add time" => 230503,
                                                    "completed" => false
                                                    )
                            )
         );

这很好用,但我想知道这是否是正确的方法。特别是因为我想存储关于每个列表和项目的一些信息(add dateadd time,最终还有更多......)

制作多个表格会更好:userslistslist items然后通过用户ID将它们连接起来吗?

我也有点想知道社交媒体网站有多大这样做......比如推特。他们是否为每条推文添加了一个新行,或者他们是否将新的推文推送到数组......还是别的什么?

非常感谢任何建议,

2 个答案:

答案 0 :(得分:2)

建议的方法是创建您提到的单独表格。 (userslistslist_items

你的关系会是这样的:

users - > lists =在两个表中按user_id列链接

lists - > list_items =在两个表中按list_id列链接

这也使用户能够拥有多个列表,而无需在用户表中添加额外的列。

如果要继续将列表项添加到序列化数组中,那么一旦数组开始增长到某个大小,您将遇到性能问题,因为您有一个巨大的列条目要进行排序。

如今,数据库非常高效,可以及时查看数百万甚至数十亿行。只记得在表所加入的所有字段上都有索引。

你可以争论那个允许4GB文本的LONGBLOB字段,但是加载那条记录需要很长时间。将它们存储为行使您可以灵活地仅检索当时所需的行。而不是每次你只需要一个

要回答关于Twitter的问题,是的,每个推文都会有一个新行。

引用alexis的评论,我觉得这是有价值的:

  

Google“规范化”,你会看到第一步(“第一步”   normal form“)是每个单元格中只存储一个值。如果可以的话   想象一下你想要查询数据库的任何场景   单一设置,给他们所有自己的列。如果内容了   设置对数据库完全透明,尤其是如果   它们是半结构化的(例如,一组不同的键值对),   那么保持数据库不知道什么是有道理的   设置是(即做你现在正在做的事情)。

数据库规范化的一些有用链接

答案 1 :(得分:0)

简短的回答是,如果你使用不同的表,你会更好。 否则,您将列表/内容的数量限制为字段的大小。