在这种情况下,我应该在设计数据库表时使用面向对象的方法

时间:2016-08-31 07:34:32

标签: mysql database performance database-design object-oriented-database

方案: 我通过面部识别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查询在详细页面上显示网站上的所有信息,所以我应该枚举所有字段还是在设计表时使用面向对象的方式?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

一般来说,使用属性还是使用新表取决于2彼此之间的关系类型。

在你的情况下,我肯定会说是。

你有一对多的关系(1:n)将每个点的一个id保留为属性会好得多。您的点表可能只存在于id和x和y值之外。我没有理由为它命名或添加face_id或pic_id。

现在,根据面部是否总是具有相同的点数(并且名称很重要),您可以为每个需要的点添加一个point_id作为面部表的属性。 或者,如果订单无关紧要,您可以为点表提供face_id并以此方式链接。 (这样你在面部表中没有任何理由没有一堆属性)

这可能有点简化,我不知道你的用例的确切工作方式。但总的来说,你看一下它是1:1,1:n还是n:n的关系,并根据你的决定做出决定。