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?)是的,我实际上有一个搜索功能,我只需取消所有用户数组的序列化,并获取匹配的列表项。。。它并不慢,但我能想象它会和你在一起