我有一个数据集,其中包含一个字符串键字段和最多50个与该信息相关的关键字。一旦将数据插入数据库,就会有很少的写入(INSERTS),但主要是查询一个或多个关键字。
我读过基于MySQL的“Tagsystems: performance tests”,似乎2NF似乎是实现这一点的好方法,但我想知道是否有人有使用SQL Server 2008和非常大的数据集的经验
我最初可能有100万个关键字段,每个字段最多可包含50个关键字。
的结构
keyfield, keyword1, keyword2, ... , keyword50
是最佳解决方案或两个表
keyid
keyfield
| 1
|
| M
keyid
keyword
如果我的查询主要是要查找包含一个或多个关键字的结果,那么这是一个更好的主意吗?
答案 0 :(得分:3)
我会进一步规范化。
您应该有一个包含整数主键列的唯一KeyWords表。然后,另一个具有KeyField和KeyWordId的关联表。
KeyWords
----------
KeyWordId Int Identity(1,1)
KeyWord VarChar(200)
KeyFieldKeyWords
----------------
Keyfield Int
KeyWordId Int
有100万个关键字段,每个关键字段有50个关键字,即5000万行。如果你有一个包含2列的表,每个都是一个整数,那么性能会有巨大的差异。
答案 1 :(得分:2)
只要你有正确的索引,50M行就不那么多了。我会把它存储为
CREATE TABLE mytable (
keyfield nvarchar(200),
keyword nvarchar(200),
CONSTRAINT PK_mytable PRIMARY KEY(keyfield, keyword)
)
,当然索引关键字列。如果您永远不需要获取关键字段的所有关键字,只需更改主键中的顺序即可避免额外的索引
编辑:当我太累了,我不应该发帖。就是这样。
答案 2 :(得分:2)
归一化可能是你更好的选择,但只有模拟工作负荷才能确定。您将比较每个100万行的50个越来越稀疏的索引与1个5000万行的索引。我怀疑,如果我是MS的天才,编写一个算法来搜索一个索引,我会选择我正在寻找的值,因为我在一次传递中进行了很长时间。
但如果有50个索引,我必须扫描50个索引。
此外,在非规范化模式中,第1列将具有高质量索引,第50列将具有低选择性并且可能导致扫描而不是索引查找。
答案 3 :(得分:0)
我无法想象像
这样的查询SELECT keyfield FROM mytable
WHERE keyword1 in (value1, value2, ...)
OR keyword2 in (value1, value2, ...)
OR keyword3 in (value1, value2, ...)
....
OR keyword5 = in (value1, value2, ...)
你的第二个选择看起来好多了 在(value1,value2,...)
中选择键字段FROM mytable WHERE关键字您需要尝试使用索引和引擎来获得最佳性能,但您可能只希望在关键字上使用一个索引。