Должен ли я использовать объектно-ориентированный подход в разработке таблиц базы данных в этом случае

Сценарий: я запускаю тонны просканированных изображений через 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 ответ

Решение

Как правило, используете ли вы атрибуты или новую таблицу, зависит от того, какое отношение эти 2 имеют друг к другу.

В вашем случае я определенно говорю да.

У вас есть отношение 1 ко многим (1:n), будет гораздо лучше сохранить один идентификатор для каждой точки в качестве атрибута. Ваша таблица баллов, вероятно, будет существовать только из значений id и x и y. Я не вижу причин, чтобы дать ему имя или добавить face_id или pic_id.

Теперь, в зависимости от того, всегда ли у лица одинаковое количество точек (и имя имеет значение), вы либо добавляете point_id для каждой необходимой точки в качестве атрибута таблицы граней. Или, если порядок не имеет значения, вы указываете таблицу точек face_id и связываете ее таким образом. (таким образом, у вас нет набора атрибутов без причины в таблице лиц)

Это может быть немного упрощено, я не знаю точную работу вашего варианта использования. Но в целом вы смотрите на отношения 1:1, 1:n или n:n и основываете свое решение на этом.

Другие вопросы по тегам