————————————————————————————————
Tag已經(jīng)成為Blog的一個事實標準之一,但是對于Tag的設計和實現(xiàn)方面很少找到相關資料:( 1.Tag是否需要單獨建表統(tǒng)計管理?那么增加、更新和刪除如何處理? 一種是用一個tag表和一個tag與其它表的關聯(lián)表來實現(xiàn),實現(xiàn)方式稍復雜些,你要記錄關聯(lián)的類型和ID。增加刪除就是處理這個關聯(lián)的表,更新可以分解為增加和刪除。 另一種是利用類似lucene的引擎,把tag丟進去就可以了,實際上我沒用過它,不過簡單測試過在rails項目里用ferret,它沒有中文分詞,搜索中文不太好用,但對于tag正合適,只要用一個字段把tag用空格分開再放進去,只索引這一個字段。增加、刪除、更新其實只需要更新tags字段,ferret索引也更新一下就可以了。 關聯(lián)性是個復雜點的問題,以前問了別人一個SQL語句,不過測試性能一般。沒想到好主意,不過暫時也用不上它。 |
1.使用數(shù)據(jù)庫來存儲,總覺得很難處理,但是方便統(tǒng)計和檢索,再更新上效率低下,另外但數(shù)據(jù)量非常大的時候,性能會下降很快。
2.使用Lucene是一個非常好的建議,但是我希望對Tag的使用上做不少細化的工作,如“Java”這個Tag在我的博客、我所在的圈子、網(wǎng)站等各級的統(tǒng)計,不知道Lucence是否支持?
3.JavaEye使用了Tag技術,不知道如何實現(xiàn)的?
_____________________________________________________________________________
1.使用數(shù)據(jù)庫來存儲,總覺得很難處理,但是方便統(tǒng)計和檢索,再更新上效率低下,另外但數(shù)據(jù)量非常大的時候,性能會下降很快。
2.使用Lucene是一個非常好的建議,但是我希望對Tag的使用上做不少細化的工作,如“Java”這個Tag在我的博客、我所在的圈子、網(wǎng)站等各級的統(tǒng)計,不知道Lucence是否支持?
3.JavaEye使用了Tag技術,不知道如何實現(xiàn)的?
————————————————————————————————————————————
這要看如何設計以及如何檢索,如果是搜索某個tag對應的記錄,其實是非常快的,tag關聯(lián)表用復合主鍵,把tag_id作復合主鍵的第1個,檢索是非常快的,因為用了主鍵索引。
2.使用Lucene是一個非常好的建議,但是我希望對Tag的使用上做不少細化的工作,如“Java”這個Tag在我的博客、我所在的圈子、網(wǎng)站等各級的統(tǒng)計,不知道Lucence是否支持?
如果是統(tǒng)計這個,用數(shù)據(jù)庫效率也可以很高,加上適當?shù)木彺妫ū热鐭衢Ttag緩存起來)。lucence不清楚。
我當時有點興趣的是如何查詢“購買了某書的人也購買了XX書”,這和標簽關聯(lián)有點相似,可以做一些關聯(lián)性內(nèi)容的推送。以前在CSDN問了一個,有人回復我一個,可以查詢“購買了C++編程語言書的人也購買了XX書”,列出前2本:
- CREATE?TABLE?store?( ??
- ?bookname?VARCHAR(255)?NOT?NULL, ??
- ?username?VARCHAR(255)?NOT?NULL, ??
- ?PRIMARY?KEY?(bookname,?username) ??
- ); ??
- ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++編程語言',?'a'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++對象模型',?'a'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++24小時通',?'a'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++速成',?'a'); ??
- ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++編程語言',?'b'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++對象模型',?'b'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++24小時通',?'b'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++速成',?'b'); ??
- ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++編程語言',?'c'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++對象模型',?'c'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++24小時通',?'c'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++速成',?'c'); ??
- ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++編程語言',?'d'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++24小時通',?'d'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++速成',?'d'); ??
- ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++編程語言',?'e'); ??
- INSERT?INTO?store?(bookname,?username)?VALUES?('C++速成',?'e'); ??
- ??
- ? ??
- ??
- select?bookname,?count(*)?from?store?where?username?in ??
- ( ??
- ?select?username?from?store?where?bookname?=?'C++編程語言' ??
- ) ??
- and?bookname?<>?'C++編程語言' ??
- group?by?bookname ??
- having?count(*)?>=?0??
- order?by?count(*)?desc ??
- limit?2; ??
效率不太高。我覺得tag最應該有的作用就是這個了。
————————————————————————————————————————————
一張tag表存儲tag到文章的對應關系。
然后每個文章還有個tagtxt字段,各個tag用空格進行分隔。
在增加/修改文章的時候,對tag進行一次關聯(lián),并增加新增的tag。
現(xiàn)在有些問題。tag名字的修改,得修改所有的tagtxt字段。不過修改tag名字的功能應當不是很必要。