Несмотря на то, что вы заявили, что нет 1-много отношений, есть:)
Я бы рекомендовал создать две таблицы для хранения пакетов. Один для хранения «заголовочной» или «скалярной» информации, которая является общей для пакета и - хотя она может определять ЧТО присутствуют данные - не является фактическими данными, хранящимися в пакете.
Ваша вторая таблица будет хранить данные для каждого пакета, причем каждая комбинация значения поля представляет строку в этой таблице. Например, следующие две таблицы:
create table packet
(
packet_id int identity(1, 1) primary key,
destination varchar(50),
sender varchar(50),
packet_type_id int not null
)
create table packet_field
(
packet_field_id int identity(1, 1) primary key,
packet_id int not null references packet (packet_id),
field_id int not null,
data varbinary(500)
)
Очевидно, что эти две таблицы делают предположения о типе и размере хранимых данных и не являются исчерпывающими в том, что им нужно хранить. Тем не менее, эта фундаментальная структура позволит динамически определять форматы пакетов и представляет собой схему, которая легко индексируется (например, добавление индекса на packet_id+field_id
в packet_field
было бы просто).
Тогда все ваше приложение отвечает за распаковку пакета и сохранение его в вашей БД в этой схеме, а затем перепаковку (при необходимости).
Конечно, с этого момента вам понадобятся таблицы, в которых хранится фактический формат пакета. Что-то вроде ...
create table packet_type
(
packet_type_id int identity(1, 1) primary key,
name varchar(200) not null
)
create table packet_type_field
(
field_id int identity(1, 1) primary key,
packet_type_id int not null references packet_type (packet_type_id)
field_offset int not null,
name varchar(200) not null
)
Опять, очевидно, упрощенно, но это показывает основную идею. У вас будет одна запись в вашей таблице packet_type
для каждого формата пакета и одна строка в packet_type_field
для каждого поля данного пакета. Это должно дать вам большую часть информации, которая понадобится вам для обработки произвольного фрагмента двоичных данных в вышеупомянутой схеме хранения пакетов.