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

Php 一个多维数组与多个具有连接行的表,php,mysql,arrays,serialization,multidimensional-array,Php,Mysql,Arrays,Serialization,Multidimensional Array,我正在建立一个列表网站(没有什么特别的,人们可以创建列表,例如“看电影”或“要做的事”,但学习东西是很好的) 当前形势: 人们注册后,我会在users表中为他们创建一行。在那一行中,我有一个名为列表的列。在此列中,我存储了一个序列化数组,其结构如下: $lists = array( "To Do" => array( "List Info" => array(

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

当前形势: 人们注册后,我会在
users
表中为他们创建一行。在那一行中,我有一个名为
列表的列。在此列中,我存储了一个
序列化数组
,其结构如下:

$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
                                                    )
                            )
         );
这很好,但我想知道这是否是正确的方法。特别是因为我想存储关于每个列表和项目的一些信息(
添加日期
添加时间
,最终还有更多…)

是否最好创建多个表:
用户
列表
列表项目
,然后通过用户ID内部联接它们

我还想知道大型社交媒体网站是如何做到这一点的。。。比如推特。他们是为每个tweet添加一个新行还是将一个新tweet推送到数组中。。。还是别的什么

任何建议都将不胜感激


Nathan

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

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

建议的方法是创建您提到的单独的表。(
用户
列表
列表项目

你的关系会是这样的:

$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
                                                    )
                            )
         );
用户
->
列出两个表中由
用户id
列链接的
=列表

列出
->
列出项目
=通过两个表中的
列表id
列链接

这还可以让用户拥有多个列表,而无需在用户表中增加一列

如果要继续将列表项添加到序列化数组中,那么一旦数组开始增长到一定大小,就会遇到性能问题,因为要排序的列条目太多


如今,数据库在及时浏览数百万甚至数十亿行方面表现相当出色。只要记住在表连接的所有字段上都有索引

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

要回答你关于twitter的问题,是的,他们会为每一条推特添加一行

引用我认为有价值的评论:

谷歌“标准化”,你会看到第一步(“第一步”) “标准形式”)是在每个单元格中仅存储一个值。如果可以的话 想象一下,在任何情况下,您都希望在数据库中查询 单一设置,给他们所有自己的列。如果 设置对数据库是完全透明的,尤其是在 它们是半结构化的(例如,一组不同的键值对), 那么,让数据库不知道 设置为(即,执行您现在正在执行的操作)

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


推荐的方法是像您提到的那样创建单独的表。(
用户
列表
列表项目

你的关系会是这样的:

$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
                                                    )
                            )
         );
用户
->
列出两个表中由
用户id
列链接的
=列表

列出
->
列出项目
=通过两个表中的
列表id
列链接

这还可以让用户拥有多个列表,而无需在用户表中增加一列

如果要继续将列表项添加到序列化数组中,那么一旦数组开始增长到一定大小,就会遇到性能问题,因为要排序的列条目太多


如今,数据库在及时浏览数百万甚至数十亿行方面表现相当出色。只要记住在表连接的所有字段上都有索引

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

要回答你关于twitter的问题,是的,他们会为每一条推特添加一行

引用我认为有价值的评论:

谷歌“标准化”,你会看到第一步(“第一步”) “标准形式”)是在每个单元格中仅存储一个值。如果可以的话 想象一下,在任何情况下,您都希望在数据库中查询 单一设置,给他们所有自己的列。如果 设置对数据库是完全透明的,尤其是在 它们是半结构化的(例如,一组不同的键值对), 那么,让数据库不知道 设置为(即,执行您现在正在执行的操作)

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


简短回答:当然,制作多个表会更好。看看任何一个数据库入门,一定有成千上万的你可以谷歌。你的方法真的无法扩展。(例如,你会如何搜索tweet?)是的,我实际上有一个搜索功能,我只需取消所有用户数组的序列化,并获取匹配的列表项。。。它并不慢,但我能想象它会和你在一起