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

标签 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 值的模式,所以我想也许我可以设计一个如下所示的点表:

    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:n),为每个点保留一个 id 作为属性会更好。不过,您的点表可能仅存在于 id 以及 x 和 y 值中。我不认为有理由给它命名或添加face_id或pic_id。

现在,根据面是否始终具有相同数量的点(并且名称很重要),您可以为每个所需点添加一个 point_id 作为面表的属性。 或者,如果顺序无关紧要,您可以为点表提供一个face_id并以这种方式链接它。 (这样就不会在face表中无缘无故地出现一堆属性了)

这可能有点简化,我不知道您的用例的确切工作原理。但一般来说,您会查看它是 1:1、1:n 还是 n:n 关系,并据此做出决定。

关于mysql - 在这种情况下我应该使用面向对象的方法来设计数据库表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243424/

相关文章:

performance - 阅读 GHC 核心

mysql - 如何在 PHPmyadmin 中终止一个线程

mysql - 使用 AND 从 term_taxnomy 表中选择

php - UTF-8贯穿始终

Java:连接到数据库以获取数据

SQL性能: WHERE vs WHERE(ROW_NUMBER)

mysql - 如何将我当前的大型 Mysql 数据库转换为 Rails 4.2

php - 防止在 sqlite 数据库 android 中重复输入

sql - MySQL - 查询所有没有预约的用户

Listview 的 ArrayAdapter notifydatasetchanged() 重绘很慢