方案: 我通过面部识别api运行了大量的爬行图像,返回的json有很多节点,如果我枚举字段,我必须将所有字段分成多个表。例如以下是其中一个表格:
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值的模式,所以我想也许我可以设计一个如下所示的Point表:
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查询在详细页面上显示网站上的所有信息,所以我应该枚举所有字段还是在设计表时使用面向对象的方式?或者有更好的方法吗?
答案 0 :(得分:0)
一般来说,使用属性还是使用新表取决于2彼此之间的关系类型。
在你的情况下,我肯定会说是。
你有一对多的关系(1:n)将每个点的一个id保留为属性会好得多。您的点表可能只存在于id和x和y值之外。我没有理由为它命名或添加face_id或pic_id。
现在,根据面部是否总是具有相同的点数(并且名称很重要),您可以为每个需要的点添加一个point_id作为面部表的属性。 或者,如果订单无关紧要,您可以为点表提供face_id并以此方式链接。 (这样你在面部表中没有任何理由没有一堆属性)
这可能有点简化,我不知道你的用例的确切工作方式。但总的来说,你看一下它是1:1,1:n还是n:n的关系,并根据你的决定做出决定。