2009-03-16 11 views
4

Je tente de créer une application de contacts comportant deux entités principales - personne et société. Une personne peut avoir plusieurs courriels, numéros et adresses. Une entreprise peut également avoir de nombreux courriels, numéros et adresses. J'essaye de déterminer la bonne conception pour ce scénario.Comment modéliser des tables avec des clés étrangères à partir de plusieurs autres tables

Option 1 - plusieurs clés étrangères
Les e-mails, les numéros et les adresses comportent deux colonnes appelées person_id et company_id. En fonction de l'entité à laquelle les données appartiennent, l'une sera nulle et l'autre contiendra un identifiant reliant au parent.

Option # 2 - une table par type par entité
Je duplique chaque table pour qu'il y ait une table company_addresses et une table person_addresses. J'aurais deux fois plus de tables, mais c'est la solution qui a le plus de sens en ce moment.

Option # 3 - une table de liens
Je crée une table - "lien". Cette table contiendra quatre colonnes: source_id, source_entity, dest_id, dest_entity. Donc, si une entreprise obtient un nouveau numéro, vous aurez une ligne comme: 1, numéro, 2, société.

Option # 4 - plusieurs tables de lien
créer un tableau pour chaque type de lien (company_address, person_address, company_email, person_email, etc.)

Quelle option choisir?

Répondre

7

Vous avez parlé de quelques pratiques que je dirais que vous évitez. J'ai écrit plus à ce sujet dans Database Development Mistakes Made by AppDevelopers (par exemple des arcs exclusifs).

En ce qui concerne votre problème, je ne choisirais aucune de ces options. Ce que vous êtes en train de trébucher est un generic Party model. Fondamentalement, vous avez une entité Partie avec des sous-types tels que Personne et Organisation. Contacts a un ID de partie en tant que clé étrangère. L'utilisation d'une superclasse/superentité commune est beaucoup plus profonde que cela, mais vous constaterez que vous l'utilisez aussi pour beaucoup d'autres choses (par exemple le concept de rôle dans son ensemble). Un grand nombre de ces problèmes de modélisation de conception de base de données ont des solutions matures pour eux, mais il n'a pas tendance à être le genre de choses que les programmeurs sont jamais enseignés. Je recommande fortement d'obtenir le livre The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises, qui va dans beaucoup plus de détails sur la façon de modéliser les personnes et les organisations ainsi que de nombreux autres problèmes typiques.

Le point clé à retenir ici est que ce que vous faites a déjà été fait.

+0

Merci cletus - Je me suis dit que c'était quelque chose qui avait déjà été fait, et étant donné la simplicité de l'exemple, j'ai imaginé qu'il y avait une pratique de conception autour de ça. Je vais vérifier le lien et le livre. – Amit

+0

Battez-moi, exactement ce que j'allais suggérer mais écrit un peu mieux que je soupçonne. Je vais certainement regarder dans les liens. – MadMurf

0

Soit l'option # 2 ou je ferais ceci:

Vous pouvez créer un EntityTable qui définira un identifiant et le type d'entité, vous pouvez avoir votre adresse, tables Établir un lien avec celui-ci.

Ensuite, vous créez une personne & Table de la société qui renvoie à l'entité. Otherwords votre Entité sous-classée. Option # 1 - Je l'ai utilisé dans le passé et cela peut devenir un casse-tête à gérer à mesure que les choses se compliquent et se développent. Option # 3 - Vous ne pouvez pas utiliser l'intégrité référencielle, et le coût que vous obtenez en sauvant quelques coups de touches pour faire l'option # 2 ne vaudra pas la peine de nettoyer les mauvaises données, ou de faire face à la complexité supplémentaire.

Questions connexes