es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Almacenamiento de objetos en capas en una grilla.

Digamos que tengo un lienzo en el que se pueden agregar varios objetos, como un/a:

  • Dibujo
  • Imagen
  • Gráfico
  • Nota
  • Tabla

Para cada objeto necesito almacenar las dimensiones y el orden de capas, por ejemplo, algo así:

  • ID de objeto
  • Índice de capa
  • Dimensiones ((x1, y1), (x2, y2))

Cada uno de los objetos tiene propiedades muy diferentes, por lo que se almacenan en diferentes tablas (o clases o lo que sea). ¿Sería posible almacenar esto en una base de datos relacional, y en caso afirmativo, cómo se podría hacer? En JSON sería algo así:


// El índice de capa es el ArrayIndex
// No es necesario almacenar el ID de objeto, ya que el objeto se almacena dentro del propio arreglo
Capas = [
{Tipo: Dibujo, Props: <ObjPropiedadesDibujo>, Dimensiones: [(1,2), (3,4)]},
{Tipo: Gráfico, Props: <ObjPropiedadesGráfico>, Dimensiones: [(3,4), (10,4)]},
{Tipo: Tabla, Props: <ObjPropiedadesTabla>, Dimensiones: [(10,20), (30,44)]},
...
]

La única opción que se me ocurrió es almacenar una clave externa (FK) a cada tabla, pero en ese caso, podría unir esto a N diferentes tablas para cada tipo de objeto, por lo que si hay 100 tipos de objetos, …

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible almacenar esta información en una base de datos relacional. Una manera de hacerlo sería crear una tabla para cada tipo de objeto, con columnas para las propiedades específicas de ese tipo de objeto y un conjunto común de columnas que incluya un índice de capa, dimensiones y un ID de objeto como clave primaria. Luego, se puede crear una tabla principal para representar el lienzo, con una clave primaria de CanvasID y una clave foránea de cada tabla de objeto hacia la tabla de Canvas. De esta manera, se pueden consultar fácilmente todos los objetos en un lienzo específico y sus respectivas dimensiones y orden de capa.

    Por ejemplo, la tabla Drawing podría parecerse a esto:

    ObjectID LayerIndex X1 Y1 X2 Y2 DrawingProperty1 DrawingProperty2
    1 0 1 2 3 4 Valor1 Valor2
    2 1 5 6 7 8 Valor3 Valor4

    Y la tabla principal Canvas podría parecerse a esto:

    CanvasID Description
    1 MiLienzo1
    2 MiLienzo2

    Para recuperar todos los objetos en un lienzo específico, la consulta SQL podría verse así:

    SELECT Drawing.ObjectID, Drawing.LayerIndex, Drawing.X1, Drawing.Y1, Drawing.X2, Drawing.Y2, Drawing.DrawingProperty1, Drawing.DrawingProperty2 
    FROM Drawing 
    JOIN Canvas ON Drawing.CanvasID = Canvas.CanvasID 
    WHERE Canvas.CanvasID = 1
    
    UNION ALL
    
    SELECT Image.ObjectID, Image.LayerIndex, Image.X1, Image.Y1, Image.X2, Image.Y2, Image.ImageProperty1, Image.ImageProperty2 
    FROM Image 
    JOIN Canvas ON Image.CanvasID = Canvas.CanvasID 
    WHERE Canvas.CanvasID = 1
    
    UNION ALL
    
    ... // continuar con otros tipos de objeto
    

    Nota que se utiliza el operador UNION ALL para combinar los resultados de cada instrucción SELECT en un solo conjunto de resultados.

    Utilizando este enfoque, se puede almacenar y consultar eficientemente información para todos los diferentes tipos de objetos en un lienzo.

Comments are closed.