我应该如何将琐碎的数据存储在数据库中?
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 一个或多个标签键非常快并且可扩展。
我有一个 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 一个或多个标签键非常快并且可扩展。