Je dois prendre en charge des champs dynamiques et des valeurs dans une grande datawarehouse pour stocker les demandes d'API. Mon utilisateur est que j'ai besoin de stocker toutes les demandes de requête API et capable d'effectuer une requête contre eux à l'avenir (il ne s'agit donc pas de stockage, donc je ne peux pas utiliser blob pour eux)
par exemple. http://example.com/?action=test&foo=abc&bar=def...
J'ai besoin de stocker tous les field => value
mappages, c'est-à-dire (action => test), (foo => abc), (bar => def)
, et puisque le champ est tellement dynamique, la seule solution que j'ai trouvée est d'utiliser une valeur d'attributs d'entité, cependant, les gens continuent à dire que c'est un très mauvais design.
Alors, considérez mon cas d'utilisation ci-dessus, quelle serait une alternative appropriée à EAV?
Mon schéma actuel en utilisant kav
Tableau requests
[.____] (id, timestamp, uri)
par exemple. (1, 149382220, '/')
Tableau params
[.____] (request_id, key, value)
par exemple. (1, 'action', 'test'), (1, 'foo', 'abc'), (1, 'bar', 'def')
Aucune suggestion?
MISE À JOUR: Nous courons l'entrepôt sur AWS Redshift
EAV n'est pas un mauvais design, en soi, il s'agit simplement d'une conception qui nécessite une juste quantité de prévoyance et peut être forcée de problèmes de performance car la quantité de données augmente. Ce peut être que pour votre système, cela fonctionnerait bien.
Lorsque j'ai conçu un système de stockage de chaînes de requête, je n'avais aucune idée à l'avance Quels champs je serais intéressé. J'ai créé une table pour stocker la chaîne de requête en format binaire sérialisé et construit un système qui m'a permis de séparer la ficelle de la requête dans ses composants une fois que je connaissais les pièces dont j'étais intéressé. De là j'ai créé un ensemble de tables; une chacune pour les ensembles de données couramment contenus dans la chaîne de requête.
Par exemple, j'avais éventuellement une table pour les données de référence, une pour les données de demande cible et une pour des éléments associés à l'utilisateur telles que la requête de recherche qu'ils ont entrée.
J'ai trouvé la possibilité de stocker la chaîne de requête entière dans une seule table en tant que blob, tout en offrant la possibilité de scinder ce blob séparément à l'avenir, répondit très bien mes besoins.