データベースに、2 つのものの類似性を表すテーブルがあります。何かのようなもの:
+------------+------+
| Field | Type |
+------------+------+
| id_a | int |
| id_b | int |
| similarity | ??? |
+------------+------+
similarity
id_a
との間の類似度をid_b
パーセントで保持し、100% 類似 (同一のもの) から0%を含まないまでの範囲で指定できます。0% 似ている (つまり、完全に異なる) ものへのリンクは保存しません。つまり、 range を保存する必要があります[100, 0)
。小数点以下の桁数はさほど重要ではありませんが、1 桁か 2 桁がよいでしょう。
私が通常提案している解決策は、のようなものを使用することですdecimal(4,2)
。私のユースケースの問題は、それが保存されること(100,0]
です。
どちらも を使用していますdecimal(4,2)
が、どちらもハックのように見えます。
オプション1
保管し、取り出すときにバックsimilarity - 0.01
を追加します。0.01
何かのようなもの:
INSERT INTO similarities (id_a, id_b, similarity) VALUES (1, 2, ? - 0.01);
その後:
SELECT id_a, id_b, similarity + 0.01 FROM similarities;
オプション 2
0% ~ 99.99% のパーセント差を格納し、取得時に類似度に変換します。
SELECT id_a, id_b, 100 - difference AS similarity FROM similarities;
MERGE
どちらの場合も、クエリに加算と減算を残すのではなく、おそらく を使用してビューを作成します。
これらよりも優れたオプションはありますか? ない場合、どれを選びますか?なぜですか?
ノート:
[1,0)
範囲を適切に表している限り、 のような他の表現を使用してもかまいません。