我正在 Build 一个列表网站(没有什么特别的,人们可以创建列表,例如'要观看的电影'或'要做'但是学习东西很好) .
The current situation :人们注册,我在 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将它们连接起来?
我也有点想知道社交媒体网站有多大这样做......比如推特 . 他们是否为每条推文添加了一个新行,或者他们是否将新的推文推送到数组......还是其他什么?
任何建议将非常感谢,
弥敦道
2 回答
建议的方法是创建像您提到的单独的表 . (
users
,lists
,list_items
)你的人际关系是这样的:
users
- >lists
=在两个表中由user_id
列链接lists
- >list_items
=在两个表中由list_id
列链接这还使您能够让用户拥有多个列表,而无需在users表中添加额外的列 .
如果您要继续将列表项添加到序列化数组中,那么一旦数组开始增长到一定大小,您将遇到性能问题,因为您有一个巨大的列条目要进行排序 .
如今,数据库非常高效,可以及时查看数百万甚至数十亿行 . 只记得在表连接的所有字段上都有索引 .
您可以争论关于
LONGBLOB
字段允许4GB文本的观点,但是加载该单个记录需要花费很长时间 . 将它们存储为行使您可以灵活地仅检索当时所需的行 . 而不是每次你甚至只需要一个要回答关于twitter的问题,是的,每个推文都会有一个新行 .
引用alexis的评论,我认为这是有 Value 的:
Some useful links on Database Normalization
http://www.studytonight.com/dbms/database-normalization.php
https://www.essentialsql.com/get-ready-to-learn-sql-database-normalization-explained-in-simple-english/
简短的回答是,如果你使用不同的表,你会更好 . 否则,您将列表/内容的数量限制为字段的大小 .