nic*_*man 2 mysql database-design web-server
我是一名大学生,与三位同事一起为一个项目构建 Web 应用程序,我拿了数据库部分。
我们的站点基本上是一个链接共享站点并支持标签,在Mysql数据库中存储标签的有效方法是什么?我想到了这些方法:
1-标签表:链接和标签之间的关系是多对多的,所以我必须用一个中间表打破它,我想不出一个SQL语句来获取带有特定标签的链接示例:用户可能会搜索链接标记为 (php , mysql ) 或 (hardware-issues , gigabyte)。
此外,即使我这样做了,它也需要 join ,我们正在使站点全球化,这意味着有一天数据库将非常庞大,我认为我们无法加入。
2-将标签作为一个数组放在链接表中:我可以放置一个字符串数组,这意味着只有一个选择语句(我认为比 join 更好)但是操作数组会很困难,链接的发布者可能会编辑他/她的链接,我可以想出一种方法来解决这个问题,但我不确定这是否是最有效的方法,当然它没有标准化,数据库会增长得更快,但我认为在服务器上,速度比尺寸。
那么有没有更好的方法呢?
为什么你认为你将无法裸露连接?事实上,如果我理解正确,您的另一个想法是将标签列表放入 varchar 列中(我说得对吗?)并通过在该列中搜索文本来搜索链接,这肯定会慢得多,因为您必须完整 -扫描每个搜索的链接表。
联接是关系数据库中正常的日常操作,不应避免。
假设你有 3 张桌子,
links(link_id, url)
tags(tag_id, tag)
tags_links(tag_id, link_id)
Run Code Online (Sandbox Code Playgroud)
您想在 (php , mysql) 中找到所有带有标签的链接吗?
select l.link_id, l.url
from links l
inner join link_tags lt on (l.link_id = lt.link_id)
inner join tags t on (lt.tag_id = t.tag_id)
where t.tag in ('php', 'mysql')
Run Code Online (Sandbox Code Playgroud)
links.link_id 和 tags.tag_id 必须是主键。在 tag_links 中,您可以将主键放在组合 (tag_id, link_id) 上 - 支持索引将使按 tag_id 快速搜索。您还可以索引该表中的 link_id 列,以便您可以快速找到给定链接的所有标签。此外,在 tags.tag 列上放置一个唯一索引,以便您可以快速从标签中找到 tag_id(并且标签无论如何都应该是唯一的,因此您正在使用这样的约束和索引强制执行重要的业务规则)。
尝试一下,将一些虚构的测试数据填充到这样的模式中,例如 1M 链接、10k 标签和 10M 标签链接,并测试性能。我想你会对结果感到惊讶。
归档时间: |
|
查看次数: |
5877 次 |
最近记录: |