Pregunta

Descripción del problema: En mi solicitud, tengo que presentar el contenido de los paquetes de datos con un formato determinado. Un ejemplo:

Un ejemplo Los datos empaquetados binarios, por ejemplo: 4 de cabecera byte, 4 tipo byte (códigos de tipo que tiene los significados previamente definidos), a continuación, la dirección de origen, dirección de destino, y así sucesivamente

.

Anteriormente, he hecho en casa implementaciones que almacenan los datos en un archivo binario (registro fijo longitud permitida de búsqueda rápida) cocinada, pero con el tiempo me di cuenta de que estoy inventando una especie de base de datos. Por ejemplo, estoy poniendo en práctica mi propio formato de almacenamiento binario muy eficiente para grandes archivos de datos. También estoy implementar mi propia indexación para funcionar rápidamente búsquedas en algunos campos. Creo que una verdadera base de datos (incluso el simple SQLite) puede hacer esto de forma transparente simple.

Pregunta # 1: son DBs útil para almacenar dichos datos, y cómo se ha de hacer? Tenga en cuenta que no hay-1-a-muchos, muchos-a-muchos mapeos aquí y otras cosas avanzadas, es sólo una secuencia normal de paquetes con una determinada estructura interna Quiero mostrar al usuario y le permitirá interactuar con (es decir, la búsqueda por un cierto campo).

Pregunta # 2: Ahora supongamos que el propio usuario puede especificar el formato de sus paquetes, es decir, en un fichero de configuración: la longitud de cada campo, su tipo, lo que significan sus valores (en el caso de una enumeración) y así sucesivamente. ¿Cómo se amplía una aplicación DB-respaldados por esto? En caso de que el usuario definir esquemas de base de datos? En caso de que el fichero de configuración será traducida automáticamente a esta esquemas? ORM?

Pregunta # 3: Aún más avanzada ... Ahora supongamos que los paquetes de datos pueden ser de longitud variable y contenidos. Es decir, para el tipo # 2 paquetes, hay algún campo, para el tipo # 3, algunos otros campos, y así sucesivamente. Pero todavía me gustaría mi aplicación para manejar la situación, que exhibe todo bien y que también permite a los usuarios especificar los formatos de archivos de configuración. ¿Cómo se hace?

Gracias de antemano.

¿Fue útil?

Solución

  

Pregunta # 1: DB son útiles para   el almacenamiento de dichos datos, y cómo debe   puede hacer?

Sin duda, una base de datos es útil para esta aplicación. Se podría implementar su propio almacén de datos para fines especiales, y tal vez sería más eficiente para su aplicación específica, porque se puede diseñarlo para que la especialización. Una base de datos relacional es más de uso general, pero se puede evitar semanas o meses de tiempo de desarrollo mediante el empleo de una base de datos.

respondí otra pregunta el día de hoy sobre el tema de cómo manejar los tipos extensibles, donde cada nuevo subtipo tiene su propio conjunto de atributos.

"tabla de productos href="https://stackoverflow.com/questions/695752/product-table-many-kind-of-product-each-product-have-many-parameters/695860#695860"> . "

Para su aplicación, elegiría el diseño de herencia de tabla hormigón.

  

Pregunta # 2: Ahora supongamos que el usuario   mismo puede especificar el formato de su   paquetes, es decir, en un fichero de configuración:   la longitud de cada campo, su tipo,   lo que significan sus valores (en caso de una   enumeración) y así sucesivamente. Cómo puedo   extender una aplicación DB-respaldados por   ¿esta?

Asumo el número de tipos de paquetes son relativamente pocos, y luego muchos paquetes se insertan con prácticamente la misma estructura. Por lo que debe utilizar la capacidad de la base de datos para gestionar los metadatos. Yo definiría una tabla adicional para cada uno de los nuevos tipos de paquetes.

Me gustaría también almacenar los paquetes "explotó" por lo que cada campo del paquete se almacena en una columna de base de datos independiente. De esa manera usted puede indexar cada columna de forma individual, para apoyar la búsqueda eficiente.

También puede definir restricciones para que algunos campos son obligatorios (NOT NULL) o sus valores limitado por las tablas de búsqueda. Una vez más, el aprovechamiento de las capacidades de la base de datos utilizar metadatos para hacer cumplir estructura consistente donde es deseable.

SQL ya soporta un estándar, lenguaje declarativo para especificar campos con tipos de datos, restricciones, etc. ¿Por qué desarrollar un lenguaje diferente que luego se tiene que traducir a SQL?

  

Pregunta # 3: Aún más avanzada ... Ahora   supongamos que los paquetes de datos pueden ser   variando en longitud y contenido.

Los campos que son opcionales en un tipo de paquete dado debe permitir NULL en la columna correspondiente.

Otros consejos

Una regla sencilla es la siguiente: Si se va a consultar los datos, entonces debería ser un campo discreta dentro de una tabla dentro de la base de datos. Si no es así, puede almacenar el BLOB y hacer con ella.

Dicho esto, si se desea derivar "metadatos" de un BLOB, y el índice de eso, entonces usted puede hacer eso fácilmente también.

Si los tipos de datos son congruentes con lo que la base de datos puede soportar (o se puede convertir con precisión), no puede haber algún valor está explotando en el BLOB a sus partes componentes que mapean muy bien en las columnas de base de datos.

El problema con la definición de "tablas sobre la marcha" (que podría hacerse fácilmente) no es tanto la definición de la tabla, pero el cambio potencial en la mesa. Las tablas que se están cambiando (es decir, una columna añadió, o se ha caído, etc.) tienden a ser inutilizable para la duración del cambio. No es un problema para 100 filas. Un problema real para millones de filas.

Si las definiciones de datos son bastante estática, a continuación, crear una instalación de mapas que permite a sus usuarios describen el BLOB, y luego usan esa definición para crear tanto una mesa compatible y convertir el BLOB adecuadamente durante la importación.

En cuanto a los "diferentes filas de diferentes tipos", todavía se puede meter en el que los datos de una sola tabla. Algunos han filas columnas "no utilizados" en comparación con otros, cada fila se identifica por tipo. Si usted tiene un montón de definiciones de filas, y un montón de varianza, se obtiene una gran cantidad de espacio desperdiciado haciendo esto. Entonces es posible que desee ir a tener una tabla para cada tipo de fila, y una tabla maestra que contiene los tipos de fila y referencias a las filas reales en las tablas reales. Sólo se necesitaría esta tabla maestra si se preocupan por las relaciones de los paquetes de datos originales entre sí (a continuación, puede almacenarlos en orden del recibo, por ejemplo, etc.).

En realidad, todo se reduce a la cantidad de datos que tiene, cuánto esperar, la cantidad de trabajo que quiere hacer frente a la cantidad que ya lo han hecho, etc.

Otra opción es posible que desee considerar es Berkeley DB o uno de sus clones. BDB es bastante bajo nivel, no hay SQL. Es más o menos una tabla de archivos respaldados muy pequeño, muy rápido hash. Ha existido siempre, y se utiliza en una gran cantidad de lugares donde la velocidad y la sencillez es lo más importante. Que había necesidad de añadir algunas funciones en la parte superior para hacer lo que estamos tratando de lograr, sin embargo.

A pesar de que usted ha declarado que no hay 1-muchas relaciones, se encuentran:)

Yo recomendaría la creación de dos mesas para el almacenamiento de paquetes. Uno para almacenar "header" o información de "escalar", que es común a la de paquetes y - mientras que puede definir qué datos están presentes - NO ES los datos reales almacenados en el paquete.

Su segunda tabla almacenaría los datos para cada paquete, con cada combinación de campo de valor que representa una fila en esta tabla. Por ejemplo, las siguientes dos tablas:

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)
)

Obviamente, estas dos tablas están haciendo suposiciones sobre el tipo y el tamaño de los datos que se almacenan y no son exhaustivas en lo que van a necesitar para almacenar. Sin embargo, esta estructura fundamental se permite formatos de paquete definidos dinámicamente y es un esquema que está fácilmente indexado (por ejemplo, la adición de un índice en packet_id+field_id en packet_field sería una obviedad).

Todo su aplicación es el responsable de que se desempaquetar el paquete y almacenarlo en la base de datos en este esquema, a continuación, volver a embalar (si es necesario).

Por supuesto, desde este momento tendrá que tablas que almacenan el formato real del paquete. Algo así como ...

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
)

Una vez más, obviamente simplificada pero muestra la idea básica. Se podría tener un único registro en la tabla de packet_type para cada formato de paquete, y una fila de la packet_type_field para cada campo en un paquete dado. Esto debería dar la mayor parte de la información que tendría que ser capaz de procesar una cantidad arbitraria de datos binarios en el esquema de almacenamiento de paquetes antes mencionado.

Tres métodos vienen a la mente.

sFlow y IPFlow pueden transmitir un conjunto limitado de contenido del paquete. Esto puede ser registrado directamente en varias bases de datos diferentes.

Otro método más específico sería una escritura una regla muy simple resoplido como origen o destino. A continuación, tendrá la captura resoplido la carga útil de los paquetes. De esta manera sólo se podrían obtener los datos reales que requiere. Por ejemplo, podría tomar sólo los campos de datos dentro del paquete. p.ej. contraseña, etc.

ngrep también puede agarrar datos selectivos derecha del alambre.

Por supuesto, cada uno de ellos podría requerir un grifo o monitor sesión en un puerto si no está haciendo la captura en el servidor / estación de trabajo en sí.

A pesar de que no soy un gran fan de esta aplicación, tenemos algún tipo de software que, básicamente, lo hace por algunas listas de llamadas. En esencia, esto es lo que hacen:

  1. Una tabla con las definiciones de columnas - llamarlo tblColumnDefs. Esta tabla contiene columnas como "Nombre", "tipo", "longitud" y "Descripción"
  2. Una tabla de instancias de master (tblPacketNames). Esencialmente, sólo "PacketTypeID", "PacketName", y "Descripción" para cada tipo de paquete que está definiendo
  3. Una tabla de instancias de definición (para usted, esto sería tblPacketColumns). Esta tabla recoge las columnas predefinidas entre sí para formar la estructura de datos que se está almacenando. Por ejemplo, podría mantener "PacketTypeID", "ColumnNumber", "ColumnID". En la base de datos-normalización de la jerga, se trata de una mesa de muchos a muchos, ya que los mapas de las columnas de los paquetes que los utilizan.
  4. En una segunda base de datos (debido a las implicaciones de SQL / inyección dinámicos de este paso), tablas se crean dinámicamente para contener los datos reales. Por ejemplo, si ha definido (en pasos de 2/3) de un tipo de paquete llamado "ping", puede tener una tabla llamada "ping" en su base de datos para mantener esos datos. Tendrá que utilizar tblPacketColumns, vinculado a tblColumnDefs, para averiguar qué tipos de campo para crear y qué tan grande debe ser. Se termina con una colección de tablas que responden a las definiciones de tipos de paquetes procedentes de la etapa 3, utilizando las columnas desde el paso 1.

NOTA: No lo particular, como las implicaciones de inyección SQL de paso 4. Creación de tablas de forma dinámica puede conducir a algunas consecuencias si la seguridad no está bien diseñado y la entrada de cualquiera de los campos introducidos por el usuario en su aplicación no se limpia adecuadamente, especialmente si esta aplicación tiene una interfaz que está disponible a los que llaman no son de confianza (es decir, Internet).

El uso de este, puede crear índices que le apetezca cuando se crean las tablas (tal vez usted tiene una columna en el paso 1, donde se marca ciertas columnas como "indexable", y los índices se crean en la parte superior de ellos cuando se crean las tablas .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top