Question

Je sais que les paires de valeurs clés ne sont pas une bonne conception de base de données, ne sont pas normalisées, etc., mais dans ce cas, je pense que c'est la solution la plus appropriée.

Mon excuse pour cela, et quelques antécédents: Un grand ensemble d'éléments est poussé dans un ensemble de tables, et chaque élément peut être marqué avec des métadonnées arbitraires que l'utilisateur peut choisir. L'utilisateur peut choisir les métadonnées car il spécifie comment il souhaite classer, signaler et afficher les éléments plus tard. Pour ce problème commercial spécifique, ce n'est pas notre place (en tant que concepteurs de systèmes) de dire quelles sont ces dimensions. Il n'y a pas un ensemble cohérent de clés utilisés entre les éléments et, dans certains cas, la présence d'une certaine clé sera utilisée comme condition de filtre.

Une autre information de fond, les entrées seront insérées, mais non mises à jour. Finalement, ils seront supprimés (séquentiellement, dans le même ordre qu'ils ont été insérés).

La question, "stockage efficace": Par cela, je fais référence aux performances de requête (lecture). Les types de requêtes suivants seront utilisés:

  • Obtenez des éléments avec la clé donnée, toute valeur
  • Obtenez des éléments avec la clé et la valeur données
  • Obtenez des éléments avec tous les noms clés
  • Obtenez des éléments avec tous les noms et valeurs clés

Fondamentalement, quel est le meilleur choix compte tenu de ces options ?:

OPTION 1

Items table:
item_id (integer, pk)
... item fields ...

ItemFacts table:
item_id (integer, fk)
key_name (nvarchar(64))
key_value (nvarchar(128))

OPTION 2

Items table:
item_id (integer, pk)
... item fields ...

Facts table:
fact_id (integer, pk)
key_name (nvarchar(64))
key_value (nvarchar(128))

ItemFacts table:
item_id (integer, fk)
fact_id (integer, fk)

(Il pourrait y avoir une troisième option où les noms de clés sont retirés à un tableau séparé pour réduire la redondance car il peut y avoir une charge totale de valeurs utilisées / possibles pour un nom de clé donné, pourrait également être intéressante)

En gros, il y aura beaucoup de correspondances de clés / valeur dupliquées. En tant que tel, il devrait y avoir une augmentation de l'efficacité de stockage. Je me rends compte que c'est un peu une question ouverte, mais qu'en est-il des performances de lecture? Que diriez-vous si je présente aussi cette requête :?

  • Obtenez des éléments où la valeur de la clé donnée commence par «x»

Si je peux apporter plus de clarification, faites-le moi savoir.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top