我正在建立一个列表网站(没有什么特别的,人们可以创建列表,例如'要观看的电影'或'要做'但是学习东西很好。)
当前情况:
人们注册,我在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 date
,add time
,最终还有更多......)
制作多个表格会更好:users
,lists
,list items
然后通过用户ID将它们连接起来吗?
我也有点想知道社交媒体网站有多大这样做......比如推特。他们是否为每条推文添加了一个新行,或者他们是否将新的推文推送到数组......还是别的什么?
非常感谢任何建议,
森
答案 0 :(得分:2)
建议的方法是创建您提到的单独表格。 (users
,lists
,list_items
)
你的关系会是这样的:
users
- > lists
=在两个表中按user_id
列链接
lists
- > list_items
=在两个表中按list_id
列链接
这也使用户能够拥有多个列表,而无需在用户表中添加额外的列。
如果要继续将列表项添加到序列化数组中,那么一旦数组开始增长到某个大小,您将遇到性能问题,因为您有一个巨大的列条目要进行排序。
如今,数据库非常高效,可以及时查看数百万甚至数十亿行。只记得在表所加入的所有字段上都有索引。
你可以争论那个允许4GB文本的LONGBLOB
字段,但是加载那条记录需要很长时间。将它们存储为行使您可以灵活地仅检索当时所需的行。而不是每次你只需要一个
要回答关于Twitter的问题,是的,每个推文都会有一个新行。
引用alexis的评论,我觉得这是有价值的:
Google“规范化”,你会看到第一步(“第一步” normal form“)是每个单元格中只存储一个值。如果可以的话 想象一下你想要查询数据库的任何场景 单一设置,给他们所有自己的列。如果内容了 设置对数据库完全透明,尤其是如果 它们是半结构化的(例如,一组不同的键值对), 那么保持数据库不知道什么是有道理的 设置是(即做你现在正在做的事情)。
数据库规范化的一些有用链接
答案 1 :(得分:0)
简短的回答是,如果你使用不同的表,你会更好。 否则,您将列表/内容的数量限制为字段的大小。