Varios valores de atributos en bases de datos Relacionales?

Cómo bien una idea son los atributos de múltiples valores en una base de datos relacional al que se refiere extensamente?

Permítanme darles un ejemplo para mostrar lo que quiero decir. Supongamos que tenemos la siguiente tabla:

UserID          Attribute1

User1           a,b,c
User2           x,y,z
User3           a,x,y
User4           c,b,z
[a,b,c,x,y,z are to be strings]

No hay otro usuario User5 a quien tengo que hacer algunas sugerencias acerca de otros usuarios en función de si su Attribute1 coincide con alguno de los otros 4 usuarios o no.

[En el gráfico de bases de datos, la tarea podría haber sido mucho más fácil como podría haber creado varios nodos de los respectivos usuarios utilizando la misma relación.]

Ahora, esta tabla es sólo un micro-nivel de abstracción de lo que es una base de datos real se verá. El número de filas en una tabla puede ser de cientos de miles, si no millones. Además, los múltiples valores, puede ser en realidad mucho más que 3. Aparte de esto, la base de datos puede ser una carga muy pesada, y en esa situación, puede haber algunos problemas.

Así, son atributos multivalor útil en estos casos? O hay alguna manera mejor de hacer lo mismo? Una manera obvia que se me ocurre es para guardarlo como:

UserID          Attribute1

User1           a
User1           b
User1           c
User2           x
User2           y
User2           z
User3           a
User3           x
User3           y
User4           c
User4           b
User4           z

Alguna forma más rápida de tratar este tipo de situaciones en las bases de datos? O hay alguna construido en características de hoy en día las bases de datos a explotar?

  • Mi intuición me dice que la relacionales parte de una base de datos relacional es mucho más optimizada de la cadena de coincidencia de la parte 🙂 Bases de datos casi siempre funcionan mejor y son más fácilmente optimizado cuando en su mayoría de forma normalizada, la cual sería la última opción (todos los atributos repartidos en varias filas).
  • Bases de datos de informes generalmente se desempeñan mejor con un pensamiento bien de la desnormalización..
  • «Base De Datos De Informes»??
  • builderau.com.au/arquitecto/base de datos/soa/…
  • casi siempre funcionan mejor y son más fácilmente optimizado cuando en su mayoría de forma normalizada» — no es cierto: la más alta forma normal es 6NF puede resultar en una ‘explosión’ de las tablas, que requieren muchos se une a escribir la más simple de las consultas y obligando a utilizar desencadenadores o de otro código de procedimiento a aplicar entre las restricciones de la tabla, ninguno de los cuales es bueno para la optimización. También tenga en cuenta que si un 5NF diseño no presenta redundancia puede ser poco práctico razón para llevarlo a 6NF sólo para eliminar ciertos no-trivial de las dependencias.
InformationsquelleAutor c0da | 2011-09-22

3 Kommentare

  1. 6

    Tener varios valores en un campo sólo es útil si los datos de peso muerto en la base de datos, es decir, si sólo lees el campo de la base de datos y procesarlos posteriormente.

    Tan pronto como usted desea utilizar los valores en el campo en una consulta, usted tendrá un enorme impacto en el rendimiento de tener que analizar el valor a comparar. Si usted poner los valores en registros separados como en el segundo ejemplo, de modo que usted puede añadir un índice en ella, no es realista que la consulta será de 10 000 veces más rápido.

    Tener un millón de registros en una tabla no es un problema. Tenemos algunas tablas que tienen más de 100 millones de discos en ellos.

  2. 3

    Aparte de lo que los otros han dicho con respecto a la normalización, me gustaría responder a la «O cualquier característica intrínseca de hoy en día databses a explotar?» parte de su pregunta:

    PostgreSQL tiene una bastante ingeniosa extensión llamada hstore que hace exactamente eso, y en una muy optimizado manera.

    La hstore tipo de datos es esencialmente un par clave/valor, donde usted puede almacenar cualquier cosa. En su ejemplo, algo como esto:

    INSERT INTO user_attributes
    (user_id, , attributes)
    VALUES
    (1, ('att1 => x, att2 => y'));

    Se inserte las llaves att1 y att2 en la columna de atributos. Esto puede ser indexados para hacer búsquedas rápidas.

    Puede consultar los datos usando esta sintaxis:

    SELECT *
    FROM user_attributes
    WHERE attributes @> ('att1 => "Some Value"')

    Esto devolverá todas las filas que tienen una clave denominada att1 y en donde se asigna el valor «algo de Valor». La anterior declaración se utilice un índice existente en la columna, por lo que la búsqueda es casi tan rápido como con un «real» de la columna. La declaración anterior se lleva a ~2ms en mi ordenador portátil para encontrar una fila en una tabla con 100.000 filas.

    También puede consultar las filas que tienen un atributo específico definido, independientemente del valor:

    SELECT user_id,
           (attributes -> 'att1')
    FROM user_attributes
    WHERE attributes ? 'att1'

    encontrará todas las filas donde att1 se define y salida el valor de aquellos.

  3. 1

    Para un n-n tabla se podría normalizar a 3 tablas (en un modelo transaccional) usuarios – user_attribute – atributos donde el user_attribute tabla se compone de la clave primaria de los usuarios y atributos.. Claves indexados y, por tanto, muy rápido para leer ops

    EDITAR DESPUÉS DE LA PREGUNTA

    Users
    int Id PrimaryKey
    string name

    User_Attribute
    UserId PrimaryKey (FK to Users.Id)
    AttributeId PrimaryKey (FK to Attributes.Id)

    Attributes
    int Id PrimaryKey
    Value

    esto resultaría en una mesa de la celebración de los usuarios, una tabla con los atributos y una tabla con la que el usuario es la celebración de lo que

    por ejemplo

       Users      User_Attribute      Attrubutes      
    id  Name   UserId AttributeId  Id Value
    1   User1  1      1            1  Att1
    2   User2  1      2            2  Att2
               2      1            3  Att3  
               2      3
    • Yo no podía conseguir lo que quería decir… Puede ser, por favor, más claro? Me refiero a que se puede explicar con referencia al ejemplo de arriba un poco?
    • Bueno… la Desnormalización es el camino a seguir en tales casos, entonces?
    • esto es lo que yo haría sí

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea