Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中存储距离_Mysql_Database Design_Distance - Fatal编程技术网

在MySQL中存储距离

在MySQL中存储距离,mysql,database-design,distance,Mysql,Database Design,Distance,我的数据库中有一个“颜色”表 用户通过用户界面输入颜色,后端搜索颜色表中最相似的颜色,计算颜色在HCL空间中的距离 我将实现一个缓存算法,它应该存储以前计算的颜色距离之间的距离,以避免重复的数学操作 对于这样的目的,什么是最好的表格布局?我对HCL不太熟悉,但根据at的描述,似乎需要两种颜色作为距离输入 所以我认为至少应该存储两组RGB以及它们之间的相应距离。我不确定您的用例,但是如果选择了选择范围,您可能还希望存储用户选择 但似乎只有有限数量的组合?似乎你可以为每个组合做一次数学运算,只需要一

我的数据库中有一个“颜色”表

用户通过用户界面输入颜色,后端搜索颜色表中最相似的颜色,计算颜色在HCL空间中的距离

我将实现一个缓存算法,它应该存储以前计算的颜色距离之间的距离,以避免重复的数学操作


对于这样的目的,什么是最好的表格布局?

我对HCL不太熟悉,但根据at的描述,似乎需要两种颜色作为距离输入

所以我认为至少应该存储两组RGB以及它们之间的相应距离。我不确定您的用例,但是如果选择了选择范围,您可能还希望存储用户选择


但似乎只有有限数量的组合?似乎你可以为每个组合做一次数学运算,只需要一个查找表?

我对HCL不太熟悉,但根据当时的描述,似乎需要两种颜色作为距离的输入

所以我认为至少应该存储两组RGB以及它们之间的相应距离。我不确定您的用例,但是如果选择了选择范围,您可能还希望存储用户选择

但似乎只有有限数量的组合?似乎您可以对每个组合进行一次计算,然后创建一个查找表?

您可以这样做:

table colors(r,g,b)
table colordistance(user_r,user_g,user_b,r,g,b,distance)
但是你希望你的用户继续输入相同的数字吗???如果只包含最接近的颜色,则此表中的最大行数为16777216

我仍然怀疑数据库访问比计算慢,所以我想到了“过早优化是万恶之源”这句话

我会在不缓存计算的情况下运行它,直到我将其视为实际问题。

您可以这样做:

table colors(r,g,b)
table colordistance(user_r,user_g,user_b,r,g,b,distance)
但是你希望你的用户继续输入相同的数字吗???如果只包含最接近的颜色,则此表中的最大行数为16777216

我仍然怀疑数据库访问比计算慢,所以我想到了“过早优化是万恶之源”这句话

我会在不缓存计算的情况下运行它,直到我将其视为实际问题。

我假设您的颜色“距离”计算如下:

sqrt((r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2)
假设您使用的是8位像素,则表中会有(256^3)^2个不同的映射。那是很大的桌子空间。(您可能会将其压缩很多,但是……请看下一点。)

你需要考虑的另一件事是数据库查找的成本,找到一个颜色距离和计算成本。我的猜测是,数据库查找可能需要一毫秒或更长时间,但度量计算应该需要1微秒或更短时间

总而言之,使用数据库表对我来说是一个非常糟糕的主意。

我假设您的颜色“距离”计算如下:

sqrt((r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2)
假设您使用的是8位像素,则表中会有(256^3)^2个不同的映射。那是很大的桌子空间。(您可能会将其压缩很多,但是……请看下一点。)

你需要考虑的另一件事是数据库查找的成本,找到一个颜色距离和计算成本。我的猜测是,数据库查找可能需要一毫秒或更长时间,但度量计算应该需要1微秒或更短时间


总而言之,使用数据库表对我来说是一个非常糟糕的主意。

以下是我的建议:

table colors(color_id, color_name, r, g, b)

table color_distances(color_1_id, color_2_id, distance)
索引: 主(颜色1、颜色2、颜色id) 索引(颜色标识、距离、颜色标识)

颜色距离将包含所有可能的颜色id组合,并且仅在需要时更新

选择将很简单:

SELECT similar_colors.*
FROM colors as similar_colors, color_distances
WHERE color_distances.color_1_id = <selected_color_id>
ORDER BY color_distances.distance ASC
选择相似的颜色*
从相似颜色的颜色,颜色距离
其中color\u distance.color\u 1\u id=
按颜色排序\u距离。距离ASC

以下是我的建议:

table colors(color_id, color_name, r, g, b)

table color_distances(color_1_id, color_2_id, distance)
索引: 主(颜色1、颜色2、颜色id) 索引(颜色标识、距离、颜色标识)

颜色距离将包含所有可能的颜色id组合,并且仅在需要时更新

选择将很简单:

SELECT similar_colors.*
FROM colors as similar_colors, color_distances
WHERE color_distances.color_1_id = <selected_color_id>
ORDER BY color_distances.distance ASC
选择相似的颜色*
从相似颜色的颜色,颜色距离
其中color\u distance.color\u 1\u id=
按颜色排序\u距离。距离ASC

正如Osama所说,这看起来像是过早的优化。根据您对算法的描述,我将:

  • 预先计算数据库中所有颜色的HCL向量,并存储一个表,该表将颜色id映射到其HCL向量
  • 应使用存储该表,以便查询点的邻居
  • 选择新颜色后,将其转换为HCL,并在HCL空间中查询其点的邻居
  • 如果需要缓存,我会缓存粗粒度的颜色,因此用户有可能重新访问以前选择的颜色

正如Osama所说,这看起来像是过早的优化。根据您对算法的描述,我将:

  • 预先计算数据库中所有颜色的HCL向量,并存储一个表,该表将颜色id映射到其HCL向量
  • 应使用存储该表,以便查询点的邻居
  • 选择新颜色后,将其转换为HCL,并在HCL空间中查询其点的邻居
  • 如果需要缓存,我会缓存粗粒度的颜色,因此用户有可能重新访问以前选择的颜色

如何存储颜色?作为三重整数?是否要缓存距离之间的距离?你如何定义这个距离?或者只是缓存dista