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

How should I store trivial data in a database?

我有一个 Web 应用程序,允许人们上传动画书动画。总是有很多对新功能的要求,例如:

标记用户(就像在 Facebook 中标记一个人 post)

标记他们的翻页笔记(想想:用类别标记 YouTube 视频,或标记 Stack Exchange 问题:database-design

将他们的翻页笔记链接到多个相关频道,以便更好地找到观众

对于 follows/subscriptions 之类的东西,我有一个名为 follows 的 table。

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| followID      | int(11)     | NO   | PRI | NULL    | auto_increment |
| followingUser | varchar(16) | NO   |     | NULL    |                |
| followedUser  | varchar(16) | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+

不过,我不太愿意开始创建数十个 table 来处理元数据。太多了。我也对使用 TEXT 数据类型来存储标签数组犹豫不决。我听说过关于效率的坏话;我在网站的一个部分处理数十万行,在另一个 table 中处理近四百万行。当您考虑可扩展性时,小的低效率并不总是很小。以order by rand()为例。

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

我正在使用 PHP 和 MySQL。

老实说,我认为以下数据库的结构非常好,但您只需要 followingUser 或 followedUser(为了更清楚起见,我会选择后者并将其称为 userBeingFollowed),就好像 A 正在关注 B 一样人 B 被人 A 跟踪是自动成立的,因此您不需要两者。此外,您需要一个时间戳列来记录以下事件发生的时间,您应该将其存储为 long(或 BigInt(11))。

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

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

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

无论哪种方式,拥有标签的主列表都可以更轻松地搜索不同的标签以关注或查看。

此外,与对字符串数组进行部分文本匹配搜索不同,在任何合理的规模下都非常慢,搜索交集的外键索引 table 一个或多个标签键非常快并且可扩展。