在这种情况下,我应该使用面向对象的方法来设计数据库表吗?
Should I use Object-oriented approach in designing database tables in this case
场景:
我通过人脸识别 运行 抓取了大量图像 api,返回的 json 节点太多,我不得不将所有字段分成多个 table如果我枚举字段。例如以下是 table 之一:
CREATE TABLE IF NOT EXISTS `face_landmark_info_nose` (
`face_id` VARCHAR(40) NOT NULL,
`pic_id` INT(11) NOT NULL,
`nose_contour_left1_x` DECIMAL(10, 6),
`nose_contour_left1_y` DECIMAL(10, 6),
`nose_contour_left2_x` DECIMAL(10, 6),
`nose_contour_left2_y` DECIMAL(10, 6),
`nose_contour_left3_x` DECIMAL(10, 6),
`nose_contour_left3_y` DECIMAL(10, 6),
`nose_contour_lower_middle_x` DECIMAL(10, 6),
`nose_contour_lower_middle_y` DECIMAL(10, 6),
`nose_contour_right1_x` DECIMAL(10, 6),
`nose_contour_right1_y` DECIMAL(10, 6),
`nose_contour_right2_x` DECIMAL(10, 6),
`nose_contour_right2_y` DECIMAL(10, 6),
`nose_contour_right3_x` DECIMAL(10, 6),
`nose_contour_right3_y` DECIMAL(10, 6),
`nose_left_x` DECIMAL(10, 6),
`nose_left_y` DECIMAL(10, 6),
`nose_right_x` DECIMAL(10, 6),
`nose_right_y` DECIMAL(10, 6),
`nose_tip_x` DECIMAL(10, 6),
`nose_tip_y` DECIMAL(10, 6),
PRIMARY KEY ('face_id, pic_id')
);
后来我注意到大多数字段都处于单个点的 x 值和 y 值的模式中,所以我在想也许我可以设计一个点 table,如下所示:
CREATE TABLE IF NOT EXISTS `facepp_point` (
`face_id` VARCHAR(40) NOT NULL,
`pic_id` INT(11) NOT NULL,
`x_value` DECIMAL(10, 6),
`y_value` DECIMAL(10, 6),
`point_name` VARCHAR(40) NOT NULL,
PRIMARY KEY('face_id, pic_id')
);
虽然这样做以后程序容易维护,但是像这样一共130个左右的点一张图片一张脸我得开一张mysql查询他们每个人在详细信息页面上显示网站上的所有信息,那么我应该枚举所有字段还是使用面向对象的方式来设计 tables?或者有更好的方法吗?
一般来说,是使用属性还是新 table 取决于两者之间的关系。
你的情况我肯定会说是。
你有一对多的关系 (1:n),最好为每个点保留一个 id 作为属性。你的观点 table 可能只存在于 id 和 x 和 y 值之外。我看不出有什么理由给它命名或添加 face_id 或 pic_id.
现在,根据面是否始终具有相同数量的点(并且名称很重要),您可以为每个需要的点添加 point_id 作为面 table 的属性。
或者,如果顺序无关紧要,您可以这样给点 table 一个 face_id 和 link。 (这样你脸上就不用无缘无故的一堆属性了table)
这可能有点简化,我不知道您的用例的确切工作原理。但一般来说,您会查看它是 1:1、1:n 还是 n:n 关系,并以此为基础做出决定。
场景: 我通过人脸识别 运行 抓取了大量图像 api,返回的 json 节点太多,我不得不将所有字段分成多个 table如果我枚举字段。例如以下是 table 之一:
CREATE TABLE IF NOT EXISTS `face_landmark_info_nose` (
`face_id` VARCHAR(40) NOT NULL,
`pic_id` INT(11) NOT NULL,
`nose_contour_left1_x` DECIMAL(10, 6),
`nose_contour_left1_y` DECIMAL(10, 6),
`nose_contour_left2_x` DECIMAL(10, 6),
`nose_contour_left2_y` DECIMAL(10, 6),
`nose_contour_left3_x` DECIMAL(10, 6),
`nose_contour_left3_y` DECIMAL(10, 6),
`nose_contour_lower_middle_x` DECIMAL(10, 6),
`nose_contour_lower_middle_y` DECIMAL(10, 6),
`nose_contour_right1_x` DECIMAL(10, 6),
`nose_contour_right1_y` DECIMAL(10, 6),
`nose_contour_right2_x` DECIMAL(10, 6),
`nose_contour_right2_y` DECIMAL(10, 6),
`nose_contour_right3_x` DECIMAL(10, 6),
`nose_contour_right3_y` DECIMAL(10, 6),
`nose_left_x` DECIMAL(10, 6),
`nose_left_y` DECIMAL(10, 6),
`nose_right_x` DECIMAL(10, 6),
`nose_right_y` DECIMAL(10, 6),
`nose_tip_x` DECIMAL(10, 6),
`nose_tip_y` DECIMAL(10, 6),
PRIMARY KEY ('face_id, pic_id')
);
后来我注意到大多数字段都处于单个点的 x 值和 y 值的模式中,所以我在想也许我可以设计一个点 table,如下所示:
CREATE TABLE IF NOT EXISTS `facepp_point` (
`face_id` VARCHAR(40) NOT NULL,
`pic_id` INT(11) NOT NULL,
`x_value` DECIMAL(10, 6),
`y_value` DECIMAL(10, 6),
`point_name` VARCHAR(40) NOT NULL,
PRIMARY KEY('face_id, pic_id')
);
虽然这样做以后程序容易维护,但是像这样一共130个左右的点一张图片一张脸我得开一张mysql查询他们每个人在详细信息页面上显示网站上的所有信息,那么我应该枚举所有字段还是使用面向对象的方式来设计 tables?或者有更好的方法吗?
一般来说,是使用属性还是新 table 取决于两者之间的关系。
你的情况我肯定会说是。
你有一对多的关系 (1:n),最好为每个点保留一个 id 作为属性。你的观点 table 可能只存在于 id 和 x 和 y 值之外。我看不出有什么理由给它命名或添加 face_id 或 pic_id.
现在,根据面是否始终具有相同数量的点(并且名称很重要),您可以为每个需要的点添加 point_id 作为面 table 的属性。 或者,如果顺序无关紧要,您可以这样给点 table 一个 face_id 和 link。 (这样你脸上就不用无缘无故的一堆属性了table)
这可能有点简化,我不知道您的用例的确切工作原理。但一般来说,您会查看它是 1:1、1:n 还是 n:n 关系,并以此为基础做出决定。