2011-03-11 129 views
0

我在表中的一个有一列VARCHAR(70)其中,I存储空间分隔标签:SQL列搜索问题(SQL Server 2005中)

Id Tags 
1 Baby Kids Learning Alphabets 
2 Kids Baby 
3 Comedy Movie Fun 
100 Kids Learning Alphabets 
500 Kids Baby 

我执行搜索的列: 获取所有的IDS我们可以在标签中添加婴儿儿童和字母

我可以在这里做标签,如'%Baby%'或标签'%Kids%'或标签'Like Alphabets%' 选择查询时,的行。但添加\删除\编辑总是非常快。

所以我添加了名为哪里存储标记字母像标签另一个表:

Tag  Id 
    Alphabets 1 
    Alphabets 100 
    Baby  1 
    Baby  2 
    Baby  500 
    Comedy  3 
    Kids  1 

这使得搜索速度更快,购买更新\删除\插入痛苦。

我的设计是否适合未来的发展?

您应该如何设计此标签列?

感谢您阅读

编辑: * 所有我想拉是相关的ID列表。基本上找到所有具有给定标签或标签的ID。就像这个问题一样,你会在右边看到“相关问题”。这就是我想要得到的。 *

回答

1

你真的必须分析你网站的哪些方面会增长,你的目标是什么。会有大量的插页吗?会有大量的标签吗?您是否需要回答“有多少个问题有'Alphabet'标签?”我讨厌“取决于”答案,但它确实取决于你的目标和期望。

+0

我有所有的问题的答案。将会有数百万个标签。只要考虑它是一个公共分享网站。如果有1000万行,每个有5个标签,那么就是50M标签。所以吨标签将在那里。我必须选择给我所有的ID,我们有字母和学习 – kheya 2011-03-11 00:56:46

+1

这听起来像标签可能会成为你的瓶颈,所以他们应该快。出于这个原因,你最近的做法似乎更好。您还可以考虑在标签表上保留一个缓存计数,以防需要回答“该标签使用了多少次?”的问题。这当然是插入/更新/删除的另一件事情,但如果您希望在每个页面视图上显示标签云,从长远来看可能会带来巨大的收益。 – skaz 2011-03-11 01:03:03

1

这里是我的建议:

创建2个新表。一个简单的存储然后,你可以简单地与表之间的加入搜索标签

Tag  Id 
    Alphabets 1 
    Baby  2 
    Comedy  3 
    Kids  4 
    Learning 5 
    Alphabets 6 

第二个将标签在第一个表

main_id tag_id 
    1   2 
    1   4 
    1   5 
    1   6 
    100  4 
    100  5 
    100  6 

链接到的条目的名称。它会更快。一定要包含适当的索引。

+0

在我的设计中,我看到零利益。我正在保存一个连接并轻松插入\ update \ delete。 – kheya 2011-03-11 01:00:29

+1

既然您问过未来的设计 - 这将是最好的方法。如果您稍后决定添加子类别并更改其中一个类别名称,这会让您的生活变得更简单。以“宝贝”为例。如果您将来决定制作不同类别的“幼儿”和“幼儿”,并且可能将所有当前的“婴儿”变为“幼儿”,则必须更新设计中的每一行,并在“婴儿” ”。与我的,你只需要更新1条目的类别表,你就完成了。 – rayman86 2011-03-11 01:05:11

+0

这也是一个很好的设计,请参阅http://www.sqlteam.com/article/database-design-and-modeling-fundamentals(多对多搜索),并查看http://en.wikipedia.org/ wiki/Database_normalization或谷歌搜索数据库规范化 – rayman86 2011-03-11 01:05:58