Question

Si les dates pour une base de données temporelle stockée dans un ou 2 tables? Si on n'a pas cette normalisation violent?

PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT

DATE1 et colonnes DATE2 indiquent que INFO1 et INFO2 sont valables pour la période entre DATE1 et DATE2. Si DATE

Dois-je diviser ce tableau? Dois-je stocker l'état (ou dépréciée en cours) dans le tableau?

Pour clarifier la question encore plus, Obsolète est le terme utilisé par l'entreprise, si vous préférez « en retard », le problème n'est pas sémantique, ce n'est pas sur les requêtes SQL non plus, je veux juste savoir quelle conception viole ou mieux (costumes règles Normalization Je sais que la normalisation n'est pas toujours le chemin à parcourir, ce n'est pas ma question non plus).

Était-ce utile?

La solution

« Je veux savoir quelle conception viole les règles de normalisation »

Dépend quel ensemble de la normalisation règles que vous voulez passer.

La première et la violation la plus probable de formes normales, et le livre de date est une violation de première NF , est votre dates butoirs dans les lignes qui contiennent des informations « courant » (faisant abstraction de la possibilité d'informations postdatés): vous violez 1FN si vous faites que nullable attribut

.

Les violations des BCNF peut se produire de toute évidence à la suite de votre choix de clés (comme il est le cas dans la base de données nontemporal conceptions trop - l'aspect temporel ne fait aucune différence ici). WRT « choix de touches »: si vous utilisez de démarrage séparée et des dates de fin (et SQL vous laisse sorte de pas d'autre choix), alors vous avez probablement devriez déclarer deux clés: l'une qui comprend la date de début, et qui comprend la date de fin.

Une autre question de conception est les multiples colonnes de données. Cette question est abordée tout à fait grand dans « données temporelles et le modèle relationnel »: si INFO1 et INFO2 peuvent changer indépendamment les uns des autres, il pourrait être préférable de décomposer vos tables pour contenir un seul attribut, afin d'éviter une « explosion de les lignes comptent » qui peut se produire si vous devez créer une nouvelle ligne complète chaque fois un seul attribut dans la ligne change. Dans ce cas, votre conception que vous a donné constitue une violation de la sixième forme normale, que (cette forme normale est) définie dans « données temporelles et le modèle relationnel ».

Autres conseils

est un concept Normalization de base de données relationnelle - il ne s'applique pas aussi bien aux bases de données temporelles. Cela ne veut pas dire que vous ne pouvez pas stocker des données temporelles dans une base de données relationnelle. Vous pouvez certainement.

Mais si vous allez avec la conception de base de données temporelle, puis les concepts de Temporal appliquent plutôt que la normalisation normalisation relationnelle.

Vous n'avez pas indiqué la signification des dates. Est-ce qu'ils se réfèrent à (a) la période où le fait déclaré était vrai dans la vraie vie, ou (b) à la période où le fait indiqué a été croyait être vrai par le titulaire de la base de données? Si (b), alors je ne le ferais jamais de cette façon. Déplacer la ligne mise à jour à une table d'archives / log immédiatement lorsque la mise à jour est effectuée. Si (a), l'instruction suivante est sujette à caution:

« les faits sont déconseillés et ne doivent pas montrer plus dans l'interface utilisateur »

Si un fait n'a pas « besoin d'apparaître dans l'interface utilisateur » plus, il n'a pas besoin d'être dans la base de données plus non plus. En gardant ces faits, il réalise qu'une seule chose: se détériorer la performance générale pour tout le reste

.

Si vous avez vraiment besoin de ces déclarations historiques de fait selon vos besoins, alors les chances sont que vos soi-disant « faits dépréciée », sont encore très pertinentes pour l'entreprise, et donc pas « déconseillés » du tout. Assumming que pour cette raison, il y a très peu de faits « vraiment » dans votre dépréciés base de données, votre conception est bonne. Il suffit de garder le nombre de petits « faits véritablement déconseillés » par périodiquement les retirer de la base de données opérationnelle.

(PS) Dire que votre conception est bonne, ne signifie pas que vous ne rencontrerez aucun problème. SQL est extrêmement mal adapté pour gérer ce genre d'information avec élégance. « Données temporelles et le modèle relationnel » est un excellent traitement du sujet. Un autre livre, celui de Snodgrass, est souvent fait l'éloge aussi, mais pas par moi. Celui-là est quelque chose d'un livre de cuisine avec des recettes pour faire face à ces problèmes dans SQL, comme le prouvent la conversation suivante sur ce livre SO sur:

(Q) "Pourquoi devrais-je lire ça?" (A) "Parce que le déclencheur que vous avez demandé est à la page 135."

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