Должен ли я использовать объектно-ориентированный подход в разработке таблиц базы данных в этом случае
Сценарий: я запускаю тонны просканированных изображений через 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 и основываете свое решение на этом.