Я использую FlatBuffers (C ++) для хранения метаданных о файле.Это включает в себя EXIF, IPTC, GPS и различные другие значения метаданных.
В моей текущей схеме у меня есть довольно нормализованное определение, согласно которому каждая из перечисленных выше групп имеет свою собственную таблицу.Корневая таблица просто содержит свойства для каждой вложенной таблицы.
Основной пример:
table GPSProperties {
latitude:double;
longitude:double;
}
table ContactProperties {
name:string;
email:string;
}
table EXIFProperties {
camera:string;
lens:string;
gps:GPSProperties;
}
table IPTCProperties {
city:string;
country:string;
contact:ContactProperties;
}
table Registry {
exifProperties:EXIFProperties;
iptcProperties:IPTCProperties;
}
root_type Registry;
Это работает, но ограничения на вложение при создании буфера начинают делать код довольно запутанным.Кроме того, разбивка свойств на отдельные таблицы приведена только для ясности в схеме.
Я рассматриваю просто "сведение" всей схемы в одну таблицу, но мне было интересно, есть ли какие-либо последствия для производительности или памяти для этого.Эта единственная таблица может иметь несколько сотен полей, хотя большинство из них будут пустыми.
Предложение:
table Registry {
exif_camera:string;
exif_lens:string;
exif_gps_latitude:double;
exif_gps_longitude:double;
iptc_city:string;
iptc_country:string;
iptc_contact_name:string;
iptc_contact_email:string;
}
root_type Registry;
Поскольку свойства не установлены или не установлены на ихзначение по умолчанию не занимает никакой памяти, я склонен полагать, что сглаженная схема не может быть проблемой.Но я не уверен.
(Обратите внимание, что производительность - моя главная задача, за которой пристально следит использование памяти. Нормализованная схема работает превосходно, но я думаю, что упрощенная схема действительно поможет мне очистить мою кодовую базу.)