MySQLフィールドでカンマ区切りを使う方法で共有します。

3080 ワード

分割されたフィールドはきっと限られていて、しかも数が少ないです。無限の文字列の中にこのフィールドが属するテーブルを格納することはできません。このフィールドに関連するテーブルは、次の表構造に代表されるcontentとこれらの原則的な問題です。みんなは開発の過程ですでによく知っていると信じています。しかし、このような方法を使って実際の問題を解決する時、心の中はきっと多少ドキドキしています。その分厚い「データベース」教材では、このような設計方法についても言及していません。標準的な方法は関係マップを使ってこの二つの表の間に線を引くべきです。それでも、効率の悪い接続クエリを使います。各開発者は標準と効率にこだわることがありますが、私たちの努力はこの方法の使用をより標準的に見せることができると思います。なお、以下で論じた使用方法はmysqlに限定されるが、他のデータベースは移植できるはずである。相関検索の多くの開発者はまだ古いLIKE方法を使って相関検索を実現しています。例えば、上記のデータベース構造の中で、content表の二つの記録にはこの2つがあります。実はこれもCMSが直面しなければならない基本的な問題です。つまり関連内容の照会です。もしあなたが初心者であれば、LIKEの方法しか思いつかないかもしれません。例えば、まず記録1を取り出してから、tagsフィールドをカンマで分割して、最後に循環してLIKEで検索したcontentテーブルの中のすべてのtagsフィールドに2の記録が含まれています。LIKE検索は元々比較的遅い方法です。それに前後のカンマの問題も処理しなければなりません。とにかく面倒なことがいっぱいあります。だから、心を静めてmysqlマニュアルをめくりましょう。何かサプライズがあるかどうか見てみましょう。この時、FIND_という名前があります。IN_SETの関数として、金色の光が目に入ります。この関数の定義を見てみましょう。
 
mysql> SELECT * FROM content;
+----+------+| id | tags | +----+------+| 1 | 1,2 | | 2 | 2,3 | +----+------+
2 rows in set (0.01 sec)
mysql> SELECT * FROM tag;
+----+-------+| id | name | +----+-------+| 1 | php | | 2 | mysql | | 3 | java | +----+-------+
3 rows in set (0.00 sec)
ああ、PERFECTです。簡単に言えば、文字列が他のカンマで区切られた文字列の中にある関数を探しています。これは私たちのために作られたものです。私たちのsqlは
 
SELECT * FROM content WHERE tag LIKE '%2%' AND id <> 1
になります。これらの関数を翻訳する過程で、mysqlの設計者がカンマでフィールドを分割する方法に対して肯定的であることを深く理解したはずです。このように見るとだいぶ良くなりました。すべてが完璧に見えますが、そうですか?実はまだないです。もしあなたの「多さ」が多くて、sql文を複数作成する必要があります。また、関連の「多さ」があります。どのように相関関係によって並べられますか?この時、mysqlの全文検索機能に注目できます。この言葉は何回も見たことがありますが、このように使うのは少ないです。直接に語句を見ましょう。
 
FIND_IN_SET(str,strlist)
Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by “,” characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (“,”) character.
という語句の優勢は明らかです。tagsフィールドを再分割する必要はありません。このクエリの原理は何ですか?MATCH AGAINSTの使い方を少し知ると、全文検索のデフォルトの区切りは句読点とstopwordsです。前者は私たちが必要とする特性です。全文検索はカンマでMATCHとAGAINSTの文字列を分割してマッチングします。上記のようにsqlは単なる例ですので、直接実行すれば、結果は得られません。原因は以下の通りです
  • あなたはtagsフィールドに対してfulltextインデックスを確立する必要があります(テストだけなら、しなくてもいいです。インデックスを作るのは性能を高めるだけで、結果には影響がありません。)
  • 句読点で区切られたワードの長さは3文字以上でなければなりません。これが肝心です。私たちのidは短すぎて、自動的に無視されます。この時、idは大きな値から伸びます。例えば、1000円ぐらいで十分です。
  • あなたはstop wordsにぶつかって、たとえばあなたのtagsフィールドはこのような'hello、nobody'で、nobodyはmysqlのデフォルトのstop wordsで、それは自動的に無視されます。stop wordsは英語の中のいくつかの無意味語で、検索する時はそれらを必要としないで、中国語の中の助詞などを類似します。しかし、私たちの使用では明らかに検索用ではないので、my.cnfファイルにftを追加することができます。stopword_file=''は、
  • を無効にします。
    WEB技術の発展に伴い、SQLに関する検索が少なくなりました。検索エンジンだけでいいということが多いです。しかし、本論文の目的はこの方法を議論するだけではなく、この結果を実現する過程を体現することである。