J'ai besoin d'adapter des données supplémentaires dans une base de données et j'ai le choix entre modifier une table existante (table_existing) ou créer de nouvelles tables.
Voici comment Table_Existing ressemble maintenant à: P>
table_existing would be converted into table_WW_1_data --------------- | ID | Field1 | | .. | ...... | | .. | ...... | --------------- table_XX_1_data ------------------------ | ID | Field1 | Field2 | | .. | ...... | ...... | | .. | ...... | ...... | ------------------------ table_YY_2_data --------------------------------- | ID | Field1 | Field2 | Field3 | | .. | ...... | ...... | ...... | | .. | ...... | ...... | ...... | ---------------------------------
5 Réponses :
Les questions sont-elles plus susceptibles de combiner des rangées FRO (XX, 1) Set avec (YY, 2) Set, etc.? P>
Si ce n'est pas le cas, le fractionnement dans des tables séparées est plus rapide, car les tables individuelles utilisées pour toutes les requêtes sont plus étroites. P>
Si vous les combinez, ils pourraient être légèrement plus lents car vous auriez besoin de syndicats qui nécessiteront des requêtes en double contre la table principale. P>
Salut @dvk - Pourriez-vous m'aider à comprendre où se diviser dans plus de tables ne paient pas? À l'heure actuelle, nous examinons 4-5 tables supplémentaires, mais votre déclaration serait-elle toujours valable si nous divisions en 400? (Voir Edition1 d'abord s'il vous plaît)
Avec la grande table aplatie, pourquoi les syndicats sont-ils nécessaires et si oui, pourquoi contiendraient-ils des hauts?
Je serais d'accord avec DVK que si vous optez pour (b), vous finirez par avoir à interroger sur plusieurs tables pour obtenir toutes vos valeurs de champ d'origine1, sans parler de la complexité des joints, etc. Ce ne serait pas un sens à moins que la scission dans Les tables séparées correspondent également à la séparation en différentes entités. P>
Je suis d'accord avec Paul dans cette question, votre question ne peut pas vraiment être répondu sans connaître les détails des entités impliquées et les délais de requêtes et de mises à jour que vous allez courir. P>
Je me souviens d'avoir ces doutes auparavant. P>
à partir d'une perspective de validation des données, l'option b) s'avère être plus favorable. Vous pouvez mieux placer des contraintes sur les champs. C'est précisément pourquoi vous voudriez scinder, disons, un Généralement, avoir beaucoup de valeurs nulles dans votre table est mauvaise pour la performance en raison de problèmes d'indexation. P>
En règle générale, tant que le nombre de tables impliquées dans vos jointures est de 4 ou moins, vous n'avez pas à vous soucier d'une performance touchée. P>
edit: strong> Si vous êtes inquiet du nombre de tables de votre base de données, je vous suggère de regarder ici . P> utilisateurs code> dans
étudiants code>,
enseignants code>, etc., etc., pour appliquer les contraintes non nulles en fonction de le rôle de l'utilisateur. p>
Salut @rabidfire - pas ici, mais ailleurs, nous avons parfois 4 jointures ou plus sur des tables! Pourriez-vous me signaler à une ressource qui explique cette règle de base plus en détail?
La limite maximale du nombre de tables dans une jointure est de 61: FROMDULY.COM/MYSQL-LIMITATIONS# LIMITS_JOINS41 Cela dit, vous pouvez aller en toute sécurité jusqu'à 10 tables aussi longtemps que vous indexez intelligemment vos colonnes. Il n'y a pas de ressource «Performance-VS-Tables» si c'est ce que vous recherchez.
Quelle est la structure de base de données plus optimale du point de vue de la vitesse? Em> p>
Eh bien, ce qui est correct, les meilleures pratiques, etc, est appelé Normalization. Si vous le faites correctement, il n'y aura pas de colonnes (non champs), pas de valeurs nulles. Les colonnes en option seront dans une table séparée, avec moins de lignes. Bien sûr, vous pouvez organiser les tables afin qu'ils sont des ensembles de colonnes en option, plutôt que (un PK plus) une colonne chacun. P>
Combiner les rangées des sous-tables dans une 5NF rangée est facile, faire vue de ia (mais ne met pas à jour via le point de vue, faire directement à chaque sous-tableau, par l'intermédiaire d'une transaction stockée proc) p. >
Plus, les petites tables, sont la nature d'une base de données relationnelle Normalisé. Habituez-vous à lui. Moins, les grandes tables sont plus lentes, en raison du manque de normalisation, les doublons et les valeurs nulles. Rejoindre est lourd dans SQL Ce qui se trouve être la meilleure performance re, pas de surprise. Pour deux raisons: p>
Les tables sont plus étroites, donc il y a plus de lignes par page, vous obtenez plus de lignes par E / S physiques, et plus de lignes dans le même espace de cache. P> li>
Puisque vous n'avez pas les valeurs nulles, ces colonnes sont fixes len, pas de déballage pour extraire le contenu de la colonne. P> li>
Ol>
Il n'y a pas de pros pour de grandes tables avec de nombreuses colonnes en option (null), contre seulement. Il n'y a jamais un pro pour violation des normes. P>
La réponse ne change pas, peu importe si vous envisagez 4 ou 400 nouvelles tables. p>
"Il n'y a pas de pros pour de grandes tables avec de nombreuses colonnes optionnelles (NULL), uniquement des inconvénients. Il n'y a jamais de professionnel pour les normes de violation." Cela me frappe comme une déclaration trop forte une déclaration donnée à toutes les preuves du monde réel au contraire.
Pendant que je suis d'accord avec la plupart des arguments, cela semble un peu du manuel. Si vous avez un coup d'œil à La dénormalisation Vous verrez la réalité est différente.
Je suis un dba SQL Server afin que je suggère de savoir ce que je ferais dans SQL Server 2008. P>
Ajoutez les colonnes à la table existante comme nullable marquant les colonnes comme clairsemées. L'utilisation de l'étiquette de rareté n'augmentera pas le stockage des colonnes supplémentaires dans les pages de table existantes et vous permettra toujours d'interroger les colonnes clairsemées en tant que colonnes. SQL Server stocke des colonnes clairsemées en interne au format XML qui peut également être interrogée ou affichée. P>
S'il y a des applications héritées qui ne peuvent pas gérer la nouvelle structure de la table p>
Si vous avez une version qui ne prend pas en charge les colonnes clairsemées, construisez une seule table enfant pour votre table existante reliant l'enfant au parent avec l'ID de la table des parents. Créez une vue sur les deux tables pour présenter les données. P>
SQL Server 2016 prend en charge JSON. Depuis que vous n'avez que récupérer ce qui est stocké, vous pouvez stocker les données dans une seule colonne JSON. C'est une option uniquement pour les versions 2016 et au-dessus.