2015-11-13 2 views
0

Je ne suis pas un administrateur de base de données, donc je ne suis pas familier avec le jargon approprié, alors peut-être que le titre de la question pourrait être un peu trompeur.Il est correct d'avoir des valeurs dupliquées dans SQL

Donc, la chose. Je Membres pour un certain système, ces membres peuvent faire partie d'un segment démographique (tout type de segment: couleur préférée, le sexe, l'emploi, etc.)

Ce sont les tables

SegmentCategory 
ID, Name, Description 

SegmentCategory_segment 
SegmentID, SegmentCategoryID 

Segment 
ID, Name, Description 

MemberSegment 
ID, MemberID, SegmentID 

Alors le gars qui a conçu la DB a décidé de tout normaliser, alors il a mis le sexe du membre sur un segment et non dans la table du député.

Est-ce correct? Selon ma logique, le genre est une propriété du Membre, donc il doit être sur son entité. Mais en faisant cela, il doit y avoir des données dupliquées (le sexe sur le membre et le genre en tant que segment). Mais un déclencheur sur la table des membres pourrait simplement corriger cela (Mettre à jour le segment sur un changement de genre). tables juste pour obtenir une propriété du membre me semble sur génie.

Ma question est de savoir si j'ai raison ou non? Si oui, comment pourrais-je proposer le changement au DBA?

+0

Modélise-t-il les données selon les besoins? vraisemblablement. À moins qu'il y ait quelque chose dans le processus que vous modélisez qui dit qu'une personne (avec un genre) pourrait ne pas avoir un segment démographique, cela semble une approche de modélisation valide. Cependant, si vous dites qu'une table a la chaîne 'Gender' dans une colonne quelque part pour identifier le genre (plutôt qu'une colonne réelle), alors vous patinez près d'un modèle de données EAV (entity attribute value) qui est méprisé et détesté par de nombreux modélisateurs de données. Discussion intéressante ici: https://www.simple-talk.com/sql/t-sql-programming/avoiding-the-eav-of-destruction/ –

+0

Votre schéma n'explique pas ce qu'est un 'Segment'. Cela pourrait être un lien dans un autre système et le genre en tant que segment pourrait être très important. –

Répondre

1

Il n'existe pas de règle générale applicable aux décisions de base de données de ce type. Cela dépend des applications/processus qu'il supporte. Une base de données pour les rapports est beaucoup plus facile à utiliser quand elle est plus dénormalisée (d'une manière bien pensée) que dans une base de données plus transactionnelle.

Vous pouvez avoir un enregistrement client réparti sur 2 tables, par exemple, si certaines données sont accessibles ou mises à jour plus souvent que d'autres parties. Supposons que vous n'ayez besoin que de la moitié des données 90% de vos requêtes, mais vous ne voulez pas faire glisser les champs varchar (max) que vous avez là pour une raison quelconque. Cela dit, ayant une table avec juste un genre/memberid est de l'autre côté de l'extrême. De ma compréhension naïve de votre situation, je pense que vous avez juste besoin d'une table des membres avec des vues sur le dessus pour vos segments. En ce qui concerne le DBA, j'imagine finalement que ce seront eux qui auront besoin de maintenir l'intégrité des données, donc je les approcherais et je leur dirais: "Qu'est-ce que tu en penses?" J'espère qu'ils verront le mérite ou seront en mesure de vous donner des raisons pour leurs décisions de conception.

+0

Eh bien, j'ai oublié de dire 'Member' c'est les données de profil d'utilisateur habituelles avec le nom, date de naissance, date d'enregistrement, etc Habituellement, le sexe, c'est sur cette entité d'où ma question. Obtenir également le profil des utilisateurs serait une opération plus fréquente que l'analyse des données avec les segments. – Vector