Lors de l'utilisation de 1-à-1 les relations entre les tables de base de données?
Un DB question de conception: lorsque vous décidez d'utiliser de 1 à 1 rapport de tables?
Un des endroits que je vois c'est, par exemple, lorsque vous avez un Utilisateur et l'Utilisateur de la table, les gens de split au lieu de les mettre toutes les colonnes seulement dans une table Utilisateur.
Techniquement, vous pouvez simplement mettre toutes les colonnes d'une table, parce que leur relation est de 1 pour 1.
Je sais que quelqu'un a dit que pour la table UserProfile, au fil du temps vous avez besoin pour l'instruction alter table pour ajouter d'autres colonnes, mais je ne pense vraiment pas que c'est une bonne raison pour diviser les tables.
Alors, si je suis à la conception d'un Utilisateur de la table et de la table UserProfile, est-il préférable pour moi de le faire dans un tableau?
Vous devez vous connecter pour publier un commentaire.
La seule fois où j'ai utilisé un 1 à 1 de relation, c'est quand je veux qu'il polymorphically appartenir à plusieurs objets.
Comme une adresse, par exemple. Un utilisateur a une adresse, une entreprise a une adresse, une vedette restaurant a une seule adresse. Tous les cas sont traités de la même table et a le même code qui les régit. Pensez-y comme la refactorisation de votre modèle de données de sorte que vous pouvez réutiliser dans d'autres endroits.
Penser à comment vous allez concevoir le business objects. Allez-vous avoir un objet Utilisateur avec 50 propriétés, ou allez-vous avoir un objet Utilisateur avec quelques détails propriétés, puis un objet de Profil qui contient d'autres données pour un profil?
Vous devriez utiliser 1-à-1 lorsque les données dans la table est liée, mais n'est pas là pour le même but. (probablement pu être mieux formulé)
Il peut aussi rendre les choses plus facile à trouver. Pas beaucoup de choses que je déteste plus que d'avoir à regarder à travers une table avec 75 colonnes.
Le classique de la raison est d'éviter nullable colonnes.
Avoir une valeur NULL dans une colonne, il peut être difficile à écrire clair (maintenable) SQL. @Ovide a écrit à ce sujet ici, en s'appuyant sur les travaux de Chris Date.
Seulement lorsque les champs dans la table UserProfile ne sont pas nécessaires pour tous le nombre d'enregistrements dans la table user. Par exemple, si vous avez eu 3 000 000 d'utilisateurs, mais seulement 3000 de ceux qui ont Userprofile, il peut être judicieux de les séparer (pour éviter tout un tas de nulle colonnes.)
Bien que maintenant un jours avec l'augmentation des bases de données de vitesse et à bas prix les coûts de stockage, il n'a pas vraiment beaucoup de différence à les diviser pour cette raison...
C'est un copier-coller depuis une autre question qui surgit aujourd'hui dans ce fil, mais il se sent utile ici. Est-il jamais un temps où l'utilisation d'une base de données 1:1 de la relation de sens?
Je les utilise principalement pour plusieurs raisons. On est des changements importants dans les taux de changement des données. Certains de mes tableaux peuvent avoir des pistes de vérification, où j'ai suivi les précédentes versions de documents, si je ne soin de suivre les versions précédentes de 5 à 10 colonnes de fractionnement de ces 5 colonnes sur une table séparée avec une piste de vérification de ce mécanisme, il est plus efficace. Aussi, j'ai peut-être des enregistrements (disons pour une comptabilité app) qui sont en écriture seulement. Vous ne pouvez pas modifier les montants en dollars, ou sur le compte qu'ils étaient pour, si vous avez fait une erreur vous avez besoin de faire un enregistrement correspondant à écrire ajuster désactiver l'enregistrement erroné, puis créer une correction de l'entrée. J'ai des contraintes sur la table de l'application le fait qu'ils ne peuvent pas être mises à jour ou effacées, mais j'ai peut-être une couple d'attributs de l'objet qui sont malléables, ceux-ci sont conservés dans un tableau distinct, sans la restriction sur la modification. Une autre fois, je ne ce qui est dans le dossier médical des applications. Il ya des données relatives à une visite qui ne peut pas être changé une fois qu'il est signé, et d'autres données liées à une visite qui peut être modifié après la signature. Dans ce cas, je fractionne les données et de mettre un trigger sur la table verrouillée en rejetant les mises à jour de la table verrouillée lors de la signature, mais en permettant à jour les données le médecin n'est pas signer.
Une autre affiche a commenté sur 1:1 ne sont pas normalisées, je ne serais pas d'accord avec que, dans certaines situations, en particulier de sous-typage. Dire que j'ai un employé de la table et la clé primaire est leur SSN (c'est un exemple, nous allons sauver le débat à savoir si c'est une bonne clé ou pas pour un autre thread). Les employés peuvent être de différents types, disons temporaire ou permanente et s'ils sont permanents, ils ont plus de champs à remplir, comme bureau numéro de téléphone, ce qui ne devrait pas être null si le type = "Permanent". Dans une 3ème forme normale de la base de données de la colonne doit dépendre uniquement de la clé, sens de l'employé, mais il dépend en réalité de l'employé et le type, donc une relation 1:1 est tout à fait normal et souhaitable dans ce cas. Il empêche également trop clairsemée tables, si j'ai 10 colonnes qui sont normalement remplis, mais 20 colonnes supplémentaires seulement pour certains types.
J'ai vu un récemment où l'on avait une table, avec la plupart des données, puis une autre table avec beaucoup, beaucoup de données en option.
La deuxième table avait un tiers des lignes, mais trois fois autant de colonnes.
Cela a été fait il y a quelques années évitez les lots de valeurs null dans les colonnes à - dire vide de l'espace.
Toutefois, si vous le faites maintenant, je serais tenté de ne pas déranger. Vivre avec le vide de l'espace. Les tracas qu'elle peut causer le développement de l'application n'est tout simplement pas en vaut la peine, et l'espace est moins cher que le temps de développement.
Cela a été bien prises en compte, mais je vais juste ajouter une note rapide pour clarifier quelque chose qui n'était pas évident pour moi et n'a pas été explicitement mentionnés. 1 pour 1 relation ne veut pas dire que pour chaque enregistrement de la table A il y a 1 enregistrement correspondant dans la table B. au Lieu de cela, cela signifie que pour chaque enregistrement dans la table A, il y aura 0 ou 1 enregistrements correspondants dans la table B.
Shane D. et d'autres décrivent des scénarios de tirer parti de ce fait.
Je pense que Shane D a une raison qui est tout à fait valable. Comme même, je suis tombé sur la même situation pour une table ayant autour de 40 colonnes, les données de ces colonnes sont téléchargés par le biais d'csvs et utilisés uniquement pour les fins de rapport, et un ensemble de colonnes de traitement de ces fichiers,qui sont souvent updataing.
Donc, Si nous maintenons une table comme une solution. Nous effectuons des mises à jour fréquentes sur la table et sera mise à jour du 5 colonnes de 50.
Je me sens chaque jour perturbe la ligne de répartition et il est fortement possibilité de la ligne de chaîne, donc pour éviter de ligne série, j'ai suivi l'approche de la séparation des données basées sur DML-activité.
Laissez-moi savoir si une meilleure solution