我做过一些研究,但未能找到明确的答案。
在性能方面更好。
注意:只有10个可能的标签,最大长度为160个字符(如果选择了所有标签)。
一个表,包含3列:id,stuff,tags ... 其中tags列是varchar
并像这样查询:SELECT * FROM table WHERE tags LIKE %tagname%
两个表:
tableA columns = id,stuff
tableB columns = id,tag
并像这样查询:SELECT * FROM tableA A INNER JOIN tableB B ON A.id = B.id WHERE B.tag = 'tagname'
插图 -
tableA中的行看起来像:123 |一些数据
tableB中的行看起来像:123 |标记名
我只是简单地询问如果没有很多标签,最好是在行中或在单独的表中存储标签。
答案 0 :(得分:4)
唐纳德·克努特(Donald Knuth)曾说过" 过早优化是所有邪恶的根源。"据了解,他表示通常不应该为性能而是为了正确性而构建一些东西,而只是进行优化以使应用程序在性能范围内要求。在表现方面更好。
您的性能要求是什么?有些人可能希望最小化内存利用率;其他人可能希望尽量减少CPU时间;其他人仍然可能意味着完全不同的表现"。
即使有人认为你的意思是"哪种操作最快",答案通常取决于各种因素,包括磁盘技术,存储引擎,索引设计,表格大小......
那么,你应该怎么做? 正常化直至疼痛;否则直到它起作用。
您的第一种方法违反了1NF。除非你有一些压倒一切的理由(你几乎不会这样做),否则不要这样做。
答案 1 :(得分:2)
肯定第二种选择更好。
您可以定义索引以便在完全扫描时更快地运行,您可以组合条件tag1 and (tag2 or tag3)
,您可以从标签中获取一些聚合数据?你可以按标签分组吗?找到具有相似标签组的类似实例。
答案 2 :(得分:1)
选择第二个选项。
第一种方法强制要求全表扫描(相当于检查表的每一条记录),而第二种方法中的结果集可以构建利用索引(假设索引是在主键上定义的[它们通常是自动]和tag
列。)
实际的性能优势取决于数据库引擎的优化器。应该有一些命令或实用程序产生“解释计划”,这是对查询处理方式的总结。
内容可能是双重荷兰语,但您的数据库管理员应该知道如何生成以及如何阅读它。