我应该如何将琐碎的数据存储在数据库中?

时间:2015-01-18 22:22:49

标签: php mysql database-design web-applications metadata

我有一个网络应用程序,允许人们上传动画片动画。总是有很多新功能的请求,例如:

标记用户(就像在Facebook帖子中标记某人一样)

标记他们的摘录(想一想:用类别标记YouTube视频,或标记Stack Exchange问​​题:database-design

将他们的摘录链接到多个相关频道,以便更有机会找到观众

对于像follow / subscriptions这样的东西,我有一个名为follows的表。

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| followID      | int(11)     | NO   | PRI | NULL    | auto_increment |
| followingUser | varchar(16) | NO   |     | NULL    |                |
| followedUser  | varchar(16) | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+
但是,我很想开始创建几十个表来处理元数据。它太多了。我也对使用TEXT数据类型存储标签数组犹豫不决。我听说过关于效率的坏事;我在网站的一个部分处理成千上万的行,而在另一个表中处理几乎四百万行。考虑可扩展性时,小的低效率并不总是很小。以order by rand()为例。

那么,在我的数据库中存储和组织琐碎信息时,我可以考虑采用哪些方法?如果我能够跟踪更多信息,我可以显着改善用户体验。

我正在使用PHP和MySQL。

2 个答案:

答案 0 :(得分:1)

最简单有效的标记方法是创建标记主列表,然后使用多对多关系记录哪些标记应用于每个FLIPBOOKS。考虑一下这个ERD:

ERD

FLIPNOTE_TAG表只是一个简单的交集,包含FLIPNOTE表和TAG主列表的外键。如何获得标签取决于您的业务规则。在Stack Exchange中,标签是一个经过审核的项目列表。在YouTube上,它们只是愚蠢的字符串,可以由用户随意添加。

无论哪种方式,拥有标签的主列表都会使搜索不同的标签更容易跟踪或查看。

此外,与在字符串数组上进行部分文本匹配搜索不同,这在任何合理的范围内都非常慢,因此搜索交集表的外键索引以获得一个或多个标记键的速度非常快且可扩展。

答案 1 :(得分:-1)

我认为以下数据库的结构非常合理,但是你只需要followUser或者FollowUser(我会选择后者并将其称为userBeingFollowed以便更清晰),好像Person A跟随Person B然后它会自动确实,B人被A人跟随,因此您不需要两者。此外,您需要一个时间戳列来记录下一次发生的时间,您应该将其存储为long(或BigInt(11))。

SQL语句是一个简单的INSERT查询,很容易理解。