【发布时间】:2011-12-03 09:36:00
【问题描述】:
我有一个数据库表,其中每一行(电影)都有几个数字标签(电影类别)。目前我将所有这些标签作为字符串放在同一列中,并使用 %LIKE% 搜索它们,当我需要查找某个类别中的所有电影时,这需要缓慢的全表扫描。
我想加快搜索这些标签的速度,但我能想到的唯一解决方案是创建第二个包含两个整数列的表。第一个包含单个类别,第二个包含电影的 rowid。
但是,这将需要在数据库中进行更多的插入。一行平均有 10 个标签,所以我必须插入 11 行,而不是插入单行。由于我的应用程序执行的插入操作比实际查询多得多,因此插入性能至关重要。
在不牺牲插入性能的情况下,还有其他方法可以解决这个问题吗?或者插入 1 行 10 列 VS 10 行 2 列之间没有太大区别吗?
【问题讨论】:
-
1.确保使用事务(插入相对快速,提交非常昂贵) 2. 使用/尝试“标准”标准化 MM 标签方法(也可能使用/尝试 1-M允许标签重复[较少标准化]:关键是使用索引)3. 对所有内容进行基准测试并再次评估。
-
1.) 我已经使用 transactions/pragma 进行插入 2.) M-M 方法?
-
我知道电影是大生意,但我不知道它们的发行速度如此惊人。您的数据录入人员一定很棒。
-
@Joshua A MM 就像
movies (movie_id, movie_title) <- movies_tags (movie_id, tag_id) -> tags (tag_id, tag_text)而 1-M 可能是movies (movie_id, movie_title) <- tags (movie_id, tag_text)(有点像帖子;id [这实际上是一个 FK] 被非规范化为价值,如果谈论自然 PK,一切都会变得模糊 ;-)。不过,我肯定会首先对更新进行基准测试(我以超过 20k 条记录/秒的速度更新,不要三思而后行)——如果它有效,它就有效,我怀疑它会正常工作。确保添加适当的索引,因为它们可以加快查询速度。 -
@ledorfier LOL :) 我只是用电影/类别作为比喻,它是工业数据
标签: database sqlite tags normalization normalize