我有一个网页应用程序,允许人们上传翻盖本动画。对于新特性的请求总是很多,例如:
给用户贴标签(就像在Facebook上贴标签一样)
标记他们的触发器(想想:用类别标记YouTube视频,或者标记堆栈交换问题:database-design)
将他们的flipnote链接到多个相关频道,以便更好地找到观众。
对于下面/订阅之类的内容,我有一个名为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 | |
+---------------+-------------+------+-----+---------+----------------+不过,我对开始创建几十个表来处理元数据相当犹豫不决。只是太多了。对于使用文本数据类型来存储标签数组,我也犹豫不决。我听说过关于效率的坏话,我在网站的一个部分处理数十万行,在另一个表中处理将近四百万行。当您考虑可伸缩性时,小的低效率并不总是很小。以order by rand()为例。
那么,在我的数据库中存储和组织琐碎的信息时,我应该考虑什么方法呢?如果我能够跟踪更多的信息,我可以显著改善用户体验。
我使用的是PHP和MySQL。
发布于 2015-01-19 02:21:00
标记的最简单和最有效的方法是创建标签的主列表,然后使用多到多的关系来记录应用于每个FLIPBOOKS的标记。考虑到这一ERD:

FLIPNOTE_TAG表只是一个简单的交集,它包含指向FLIPNOTE表和TAG主列表的外键。如何获得标记取决于您的业务规则。在堆栈交换中,标记是经过调整的项目列表。在YouTube上,它们只是用户可以随意添加的哑字符串。
无论哪种方式,拥有一个标签的主列表使得搜索不同的标记来跟踪或查看要容易得多。
此外,与在字符串数组上执行部分文本匹配搜索不同,字符串数组在任何合理的比例上都非常缓慢,因此在交叉表的外键索引中搜索一个或多个标记键是非常快速和可伸缩的。
发布于 2015-01-18 22:37:32
我认为,为了诚实起见,下面的数据库结构很好,但是您只需要followingUser或followedUser (为了更清晰起见,我会选择后者并将其命名为userBeingFollowed ),就好像Person A是跟随Person B一样,那么Person B被人A自动跟踪,所以您不需要两者兼而有之。另外,您需要一个时间戳列来记录发生以下情况的时间,并且您应该将其存储为一个长(或BigInt(11))。
SQL语句是一个简单的INSERT查询,非常容易理解。
https://stackoverflow.com/questions/28015504
复制相似问题