Проектирование таблицы для хранения данных EXIF

#sql #database #sqlite #exif #system.data.sqlite

#sql #База данных #sqlite #exif #system.data.sqlite

Вопрос:

Я ищу наилучшую производительность при запросе таблицы, содержащей данные EXIF. Рассматриваемые запросы будут искать в данных EXIF только указанные строки и возвращать индекс строки при совпадении.

С учетом сказанного, было бы лучше хранить данные EXIF в таблице с отдельными столбцами для каждого из тегов или мне подойдет хранение всех тегов в одном столбце в виде одной длинной строки с разделителями?

Я буду хранить около 115 тегов EXIF, и каждая запись будет иметь длину от 1500 до 2000 символов, если объединить ее в одну строку.

Ответ №1:

Если вы храните их все в одном столбце, вы не сможете получить преимущества в производительности от индексов. Вы также нарушаете основное правило проектирования базы данных, которое имеет свои последствия (в каждом столбце должна храниться только одна часть данных).

Я бы, вероятно, использовал структуру, подобную этой:

 CREATE TABLE Image_EXIF (
    image_id    INT,
    exif_tag_id INT,
    exif_value  VARCHAR(100),  -- I don't know what an appropriate size would really be
    CONSTRAINT PK_Image_EXIF PRIMARY KEY CLUSTERED (image_id, exif_tag_id),
    CONSTRAINT FK_Image_EXIF_image_id FOREIGN KEY image_id REFERENCES Images (image_id),
    CONSTRAINT FK_Image_EXIF_exif_tag_id FOREIGN KEY exif_tag_id REFERENCES EXIF_Tags (exif_tag_id)
)
  

Таблица EXIF_Tags будет содержать все допустимые теги, а таблица Images будет содержать изображения. Затем вы можете иметь индексы для exif_tag_id столбца и, возможно exif_value , столбца для быстрого поиска.

Комментарии:

1. Итак, для каждой записи в Image таблице в таблице будет 115 записей Image_EXIF , правильно?