我目前有两张桌子:
搜索匹配:
match_id (int) <-- primary key
parent_id (int) <-- foreign-key
word_id (int) <-- foreign-key (to a table filled with words that are unique and have an id)
pos (int) <-- the position of the word in the block of text it comes from
search_words:(更新)
word_id (int) <-- primary key
word (varchar ...) <-- the word
(我用的是innodb,我的主机不会升级mysql,所以全文出)
我希望我的用户能够使用“搜索”。这样他们就可以搜索“foo bar”。
我已经想到了几种方法,但最不密集的似乎是添加另一列:
next_pos (int)
然后我可以做
(SELECT * FROM table WHERE word_id='foo') as foo
INNER JOIN (SELECT * FROM table WHERE word_id='bar') AS bar
ON (
foo.parent_id=bar.parent_id AND
foo.next_pos=bar.next_pos
)
它的代价是为第一个单词之外的每个单词存储一个额外的列和一个内部连接,但它是迄今为止我想出的最佳选择。(之前的想法是减少一列,但需要在 ON 块内进行加法操作,我认为随着网站的增长,这可能太昂贵了。
这是我最好的选择,还是有其他选择?我仍然只是在舞台上玩,所以现在是时候做出改变了。
更新1:
我现在正在考虑使用关键字表来缩小搜索范围,然后使用 like 代替多个连接,因为这可能更快,并且大大消除了连接的需要。对我的整个数据库进行点赞是没有效率的。