我的数据库中有一个表,表示两件事之间的相似性。就像是:
+------------+------+
| 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)
,只要它很好地表示范围即可。