Aide à la design de database: De qui est ce enfant de toute façon

Je construis ma femme un programme de gestionnaire de contacts comme un exercice amusant dans l'apprentissage de Silverlight 4. Il permettra de suivre les adresses des peuples, numéros de téléphone, e-mails, occasions spéciales (anniversaire, anniversaire, etc)

En cours de route, j'ai heurté une petite bosse de la route pendant la design de la database. Elle aimerait pouvoir regrouper Contacts ( personnes ) par famille, j'ai donc créé une table Families avec FamilyID et FamilyDescription , puis FamilyID ajouté FamilyID à Table People .

Maintenant, SELECT * FROM People WHERE FamilyID = 2 renvoie tout le monde dans cette famille particulière.

Je pense que c'est une idée acceptable; Là où je me bats, cependant, c'est comment intégrer les enfants, comme chez les enfants. Nous avons une très, très grande famille donc il y aura plusieurs enfants par famille. Est-ce que je les ajoute à la table People, si oui, comment puis-je différencier les enfants des adultes?

Je suis très reconnaissant pour toute idée, merci.

Le problème avec le PEOPLE.familyid est qu'il garantit qu'une personne peut appartenir à une seule famille – jamais. Ce qui veut dire que si vous vouliez faire la différence entre famille immédiate et famille élargie, vous auriez une structure hiérarchique pour associer les familles quand elles ne sont pas nécessairement hiérarchiques …

La solution la plus accommodante consisterait à inclure une table many-to-many, de sorte que vous puissiez associer un logging PEOPLE à un nombre quelconque d'loggings FAMILY :

PEOPLE_FAMILY_MAP

  • PEOPLE_ID (key primaire, key étrangère à PEOPLE.id )
  • FAMILY_ID (key primaire, key étrangère à FAMILY.familyid )

Si vous souhaitez afficher les relations entre les personnes, vous devez disposer d'une table de type de relation (type_code, description) et de relations d'association à l'aide de:

  • PERSON_ID (key primaire, key étrangère à PEOPLE.id )
  • RELATED_TO_PERSON_ID (key primaire, key étrangère à PEOPLE.id )
  • RELATIONSHIP_TYPE_CODE (key primaire, key étrangère à RELATIONSHIP_TYPE_CODES.RELATIONSHIP_TYPE_CODE )

N'auriez-vous pas une colonne Mère et Père par entité Personnes, qui a référencé un autre PeopleId?

Les enfants sont aussi des gens, vous savez!

Aussi, quelle est votre définition d'une famille? Les gens qui vivent à la même adresse. Boxer les gens dans une famille semble difficile, combien de générations constitue une famille.

Et mon idée d'une colonne mère-père par entité People ne prend pas en count les couples homosexuels avec enfants, mais nous ne devrions pas trop penser au problème ou vous pourriez vous rendre fou.

Découvrez cet exemple d'applet WPF – http://www.vertigo.com/familyshow.aspx

Vous pouvez créer un Level colonne dans la table People et lui affecter la génération.

Exemple: Les grands-parents auront le niveau -2, les parents auront -1, les enfants / adolescents auront 0, leurs enfants (futurs) en auront 1, les animaux domestiques en auront 2, etc.

Ensuite, vous pouvez facilement générer la list d'une famille par générations.

Je ferais une sorte de table d'intersection et assignerais peut-être un champ sur la relation pour "type de relation" … ainsi vous pourriez définir comme tantes et oncles, ou belle-mère, beau-père … etc. table de famille comme vous décrivez. Cela réduit le nombre de champs et empêche l'apparition de vides ou de vides potentiels, au désortingment de plus de lignes …

L'avantage ici est que les enfants peuvent aussi être parents plus tard. Vous pouvez donc continuer à définir de nouvelles familles et ne pas changer les relations antérieures. Vous permet également de refind toutes les familles dont une personne fait partie, ou vous permet de stringr pour find des familles apparentées … (trouvez toutes les familles où familyX.relationtype = les enfants apparaissent …)

Juste comment je choisirais de le faire.

OK, je vais aller un path différent ici.

Elle veut des familles parce qu'elle veut être en mesure de leur envoyer un courrier électronique massivement spam bien sûr. Ce n'est donc pas comme si nous avions besoin de chaque famille dans la list des familles. Vraiment, elle va créer des familles et append des gens à leur besoin (comme une list de diffusion).

Alors:

Avoir une table de famille:

  • FamilyId
  • prénom
  • La description

Alors juste avoir une table de mappage:

  • FamilyId
  • PersonId
  • Rôle

rôle peut être l'un des suivants ("chef de famille" (alias les décideurs – aka, le buck s'arrête là), "Peon")

Ensuite, pour M. et Mme Johnson, vous pouvez avoir la famille "The Johnsons". mais si vous voulez spammer tous leurs proches, utilisez "The Johnsons extended"