2 votes

Laquelle de ces deux approches MySQL DB Schema serait la plus efficace pour la recherche et le tri ?

Je ne sais pas laquelle des deux approches de schéma de base de données je dois adopter dans la situation suivante.

J'ai besoin de stocker plusieurs attributs pour un site web, par exemple la taille de la page, le nombre de mots, la catégorie, etc. et où le nombre d'attributs peut augmenter à l'avenir. Le but est d'afficher ce tableau à l'utilisateur et il devrait être en mesure de filtrer/trier rapidement les données (la structure du tableau devrait donc permettre des requêtes et des tris rapides). Je souhaite également conserver un journal des données précédentes afin de maintenir une chronologie des changements. Les deux options de structure de table auxquelles j'ai pensé sont les suivantes :

Option A

attributs du site web

id, website_id, page_size, word_count, category_id, title_id, ...... (jusqu'à 18 colonnes et il faut garder à l'esprit qu'il peut y avoir quelques valeurs nulles et qu'il sera peut-être nécessaire d'ajouter d'autres colonnes à l'avenir).

site_attributs_change_log

même structure de table que ci-dessus avec une colonne supplémentaire pour "change_update_time".

Je pense que l'avantage de ce schéma est que les requêtes seront faciles à écrire même si certains attributs sont liés à d'autres tables et que le tri sera également simple. L'inconvénient, je suppose, est que l'ajout de colonnes ultérieurement peut poser des problèmes avec ALTER TABLE qui prend beaucoup de temps à s'exécuter sur de grandes tables de données + il peut y avoir de nombreuses lignes avec de nombreuses colonnes nulles.

Option B

champs_d'attributs_du_site_web

attribute_id, attribute_name (par exemple page_size), attribute_value_type (par exemple int)

attributs du site web

id, website_id, attribute_id, attribute_value, last_update_time

L'avantage de cette approche semble être sa flexibilité, en ce sens que je peux ajouter des colonnes à tout moment et que j'économise de l'espace de stockage. Cependant, même si j'aimerais adopter cette approche, j'ai l'impression que l'écriture de requêtes sera particulièrement complexe lorsqu'il faudra afficher les tables [puisque je devrai afficher les enregistrements de plusieurs sites à la fois et qu'il y aura également des références croisées avec d'autres tables pour certains attributs]. + le tri des données pourrait être difficile [étant donné qu'il ne s'agit pas d'une approche basée sur des colonnes].

Voici un exemple de ce que je chercherais à obtenir :

Site-A.com, 232032 bytes, 232 words, PR 4, Real Estate [linked to category table],

Site-B.com, ..., ..., ... ,...

De plus, l'utilisateur doit pouvoir trier toutes les colonnes basées sur les nombres, auquel cas l'approche B pourrait s'avérer difficile.

Je veux donc savoir si j'ai bien fait de choisir l'option A ou s'il existe d'autres options plus intéressantes que je n'aurais peut-être même pas envisagées au départ.

2voto

Bill Karwin Points 204877

Je recommande d'utiliser l'option A.

Vous pouvez atténuer les inconvénients d'une exécution prolongée de la commande ALTER TABLE en utilisant la commande pt-online-schema-change .

La prochaine version de MySQL 5.6 prend en charge ALTER TABLE non bloquant des opérations.

L'option B est appelée Entité-Attribut-Valeur ou EAV. Cela enfreint les règles de conception des bases de données relationnelles, et il sera donc difficile d'écrire des requêtes SQL sur des données dans ce format. Vous devrez probablement regrette de l'avoir utilisé .

J'ai posté plusieurs fois sur Stack Overflow décrire les pièges de la VAE.
Aussi dans mon blog : EAV FAIL .

0voto

Crystal Points 72

L'option A est une meilleure solution, même si le temps nécessaire à l'ajout d'une colonne supplémentaire dans la table d'alerte peut être important, les options d'interrogation et de tri sont plus rapides. J'ai déjà utilisé le modèle de l'option A, et cela ne prend pas trop de temps lorsque la table d'alerte contient des millions d'enregistrements.

0voto

shubham garg Points 105

Vous devriez choisir l'option 2 car elle est plus flexible et utilise moins de mémoire vive. Lorsque vous utilisez l'option 1, vous devez récupérer une grande quantité de contenu dans la mémoire vive, ce qui augmente les risques de défaut de page. Si vous voulez augmenter le temps d'interrogation de la base de données, vous devez absolument indexer votre base de données pour obtenir des résultats rapides.

0voto

frayab Points 2430

Je pense que l'option A n'est pas une bonne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X